mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-09 07:09:11 +02:00
2.14 deprecation removals (#2329)
* Initialize 2.14 deprecation removal branch * Remove deprecated FASTMCP_SERVER_ environment variable prefix (#2330) * Remove deprecated Context.get_http_request method (#2332) * Remove fastmcp.Image top-level import (deprecated 2.8.1) (#2334) * Remove test warnings (#2331) * Create new branch and fix issue * Remove deprecated client parameter from FastMCPProxy (#2333) * Remove deprecated run_streamable_http_async method (#2338) * Remove deprecated sse_app method (#2337) * Remove deprecated run_sse_async method (#2335) * Remove deprecated run_sse_async method * Update CLI and tests to use run_http_async(transport="sse") - Change CLI to call run_http_async with transport="sse" instead of run_sse_async - Update test to mock run_http_async with create=True for v1 servers * Revert CLI changes - v1 servers do have run_sse_async - Keep CLI calling run_sse_async() for v1 compatibility - Update test to mock run_sse_async (which exists on v1) * Remove unnecessary type ignore for run_sse_async Method exists on v1 FastMCP class, no type error * Remove unused imports after test deletion * Remove deprecated streamable_http_app method (#2336) * Remove deprecated dependencies parameter from FastMCP constructor (#2340) * Remove output_schema=False support (deprecated 2.11.4) (#2339) * Remove deprecated client parameter from FastMCPProxy (#2333) * Delete deprecated test_output_schema_false.py Tests functionality that has been removed * Remove deprecated BearerAuthProvider module (#2341) * Remove resource_prefix_format="protocol" support (deprecated 2.4.0) (#2342) * Remove resource_prefix_format="protocol" support (fixes #2195) Removes deprecated protocol format (prefix+resource://path) and keeps only path format (resource://prefix/path). Since only one format remains: - Removed resource_prefix_format from settings, FastMCP.__init__, and helpers - Simplified add_resource_prefix, remove_resource_prefix, has_resource_prefix - Removed MountedServer.resource_prefix_format field - Deleted tests for protocol format All resource prefixes now use path format exclusively. * Clean up resource_prefix_format references - Remove from test files - Update documentation to remove protocol format section - Move custom HTTP routes note to mounting section - Remove resource_prefix_format from settings docs * Use inline version note instead of badge for prefix format * Remove obsolete test functions and update docs - Delete test functions that no longer assert anything - Remove proxy.mdx reference to deleted prefix format section * Format error messages per ruff * Remove from_client classmethod (deprecated 2.8.0) (#2343) * Remove deprecated from_client classmethod (fixes #2192) * Remove unused Client import * Remove add_resource_fn method (deprecated 2.7.0) (#2345) * Update SDK * Add missing imports for exclude_args deprecation warning
This commit is contained in:
parent
4d22d9c4d7
commit
ee5f465a82
41 changed files with 245 additions and 1609 deletions
|
|
@ -1234,7 +1234,7 @@ This release introduces completely new tools for generating and customizing MCP
|
|||
|
||||
## [v2.4.0: Config and Conquer](https://github.com/jlowin/fastmcp/releases/tag/v2.4.0)
|
||||
|
||||
**Note**: this release includes a backwards-incompatible change to how resources are prefixed when mounted in composed servers. However, it is only backwards-incompatible if users were running tests or manually loading resources by prefixed key; LLMs should not have any issue discovering the new route. See [Resource Prefix Formats](https://gofastmcp.com/servers/composition#resource-prefix-formats) for more.
|
||||
**Note**: this release includes a backwards-incompatible change to how resources are prefixed when mounted in composed servers. However, it is only backwards-incompatible if users were running tests or manually loading resources by prefixed key; LLMs should not have any issue discovering the new route.
|
||||
|
||||
### New Features 🎉
|
||||
|
||||
|
|
|
|||
|
|
@ -356,7 +356,6 @@
|
|||
"python-sdk/fastmcp-server-auth-providers-auth0",
|
||||
"python-sdk/fastmcp-server-auth-providers-aws",
|
||||
"python-sdk/fastmcp-server-auth-providers-azure",
|
||||
"python-sdk/fastmcp-server-auth-providers-bearer",
|
||||
"python-sdk/fastmcp-server-auth-providers-debug",
|
||||
"python-sdk/fastmcp-server-auth-providers-descope",
|
||||
"python-sdk/fastmcp-server-auth-providers-discord",
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ FastMCP CLI tools using Cyclopts.
|
|||
|
||||
## Functions
|
||||
|
||||
### `with_argv` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L67" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `with_argv` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L65" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
with_argv(args: list[str] | None)
|
||||
|
|
@ -27,7 +27,7 @@ Args are provided without the script name, so we preserve sys.argv[0]
|
|||
and replace the rest.
|
||||
|
||||
|
||||
### `version` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L90" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `version` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L88" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
version()
|
||||
|
|
@ -37,7 +37,7 @@ version()
|
|||
Display version information and platform details.
|
||||
|
||||
|
||||
### `dev` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L128" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `dev` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L126" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
dev(server_spec: str | None = None) -> None
|
||||
|
|
@ -50,7 +50,7 @@ Run an MCP server with the MCP Inspector for development.
|
|||
- `server_spec`: Python file to run, optionally with \:object suffix, or None to auto-detect fastmcp.json
|
||||
|
||||
|
||||
### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L306" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L286" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run(server_spec: str | None = None, *server_args: str) -> None
|
||||
|
|
@ -74,7 +74,7 @@ fastmcp run server.py -- --config config.json --debug
|
|||
- `server_spec`: Python file, object specification (file\:obj), config file, URL, or None to auto-detect
|
||||
|
||||
|
||||
### `inspect` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L540" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `inspect` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L520" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
inspect(server_spec: str | None = None) -> None
|
||||
|
|
@ -105,7 +105,7 @@ fastmcp inspect # auto-detect fastmcp.json
|
|||
- `server_spec`: Python file to inspect, optionally with \:object suffix, or fastmcp.json
|
||||
|
||||
|
||||
### `prepare` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L785" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `prepare` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/cli/cli.py#L765" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
prepare(config_path: Annotated[str | None, cyclopts.Parameter(help='Path to fastmcp.json configuration file')] = None, output_dir: Annotated[str | None, cyclopts.Parameter(help='Directory to create the persistent environment in')] = None, skip_source: Annotated[bool, cyclopts.Parameter(help='Skip source preparation (e.g., git clone)')] = False) -> None
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
---
|
||||
title: bearer
|
||||
sidebarTitle: bearer
|
||||
---
|
||||
|
||||
# `fastmcp.server.auth.providers.bearer`
|
||||
|
||||
|
||||
Backwards compatibility shim for BearerAuthProvider.
|
||||
|
||||
The BearerAuthProvider class has been moved to fastmcp.server.auth.providers.jwt.JWTVerifier
|
||||
for better organization. This module provides a backwards-compatible import.
|
||||
|
||||
|
|
@ -7,7 +7,7 @@ sidebarTitle: context
|
|||
|
||||
## Functions
|
||||
|
||||
### `set_context` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L94" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `set_context` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L91" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
set_context(context: Context) -> Generator[Context, None, None]
|
||||
|
|
@ -15,7 +15,7 @@ set_context(context: Context) -> Generator[Context, None, None]
|
|||
|
||||
## Classes
|
||||
|
||||
### `LogData` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L70" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `LogData` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L67" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
Data object for passing log arguments to client-side handlers.
|
||||
|
|
@ -24,7 +24,7 @@ This provides an interface to match the Python standard library logging,
|
|||
for compatibility with structured logging.
|
||||
|
||||
|
||||
### `Context` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L103" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `Context` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L100" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
Context object providing access to MCP capabilities.
|
||||
|
|
@ -72,7 +72,7 @@ The context is optional - tools that don't need it can omit the parameter.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `fastmcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L155" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `fastmcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L152" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
fastmcp(self) -> FastMCP
|
||||
|
|
@ -81,7 +81,7 @@ fastmcp(self) -> FastMCP
|
|||
Get the FastMCP instance.
|
||||
|
||||
|
||||
#### `request_context` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L184" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `request_context` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L181" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
request_context(self) -> RequestContext[ServerSession, Any, Request] | None
|
||||
|
|
@ -110,7 +110,7 @@ async def on_request(self, context, call_next):
|
|||
```
|
||||
|
||||
|
||||
#### `report_progress` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L212" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `report_progress` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L209" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
report_progress(self, progress: float, total: float | None = None, message: str | None = None) -> None
|
||||
|
|
@ -123,7 +123,7 @@ Report progress for the current operation.
|
|||
- `total`: Optional total value e.g. 100
|
||||
|
||||
|
||||
#### `list_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L239" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `list_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L236" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
list_resources(self) -> list[MCPResource]
|
||||
|
|
@ -135,7 +135,7 @@ List all available resources from the server.
|
|||
- List of Resource objects available on the server
|
||||
|
||||
|
||||
#### `list_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L247" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `list_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L244" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
list_prompts(self) -> list[MCPPrompt]
|
||||
|
|
@ -147,7 +147,7 @@ List all available prompts from the server.
|
|||
- List of Prompt objects available on the server
|
||||
|
||||
|
||||
#### `get_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L255" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L252" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_prompt(self, name: str, arguments: dict[str, Any] | None = None) -> GetPromptResult
|
||||
|
|
@ -163,7 +163,7 @@ Get a prompt by name with optional arguments.
|
|||
- The prompt result
|
||||
|
||||
|
||||
#### `read_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L269" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `read_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L266" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
read_resource(self, uri: str | AnyUrl) -> list[ReadResourceContents]
|
||||
|
|
@ -178,7 +178,7 @@ Read a resource by URI.
|
|||
- The resource content as either text or bytes
|
||||
|
||||
|
||||
#### `log` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L280" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `log` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L277" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
log(self, message: str, level: LoggingLevel | None = None, logger_name: str | None = None, extra: Mapping[str, Any] | None = None) -> None
|
||||
|
|
@ -196,7 +196,7 @@ Messages sent to Clients are also logged to the `fastmcp.server.context.to_clien
|
|||
- `extra`: Optional mapping for additional arguments
|
||||
|
||||
|
||||
#### `client_id` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L309" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `client_id` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L306" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
client_id(self) -> str | None
|
||||
|
|
@ -205,7 +205,7 @@ client_id(self) -> str | None
|
|||
Get the client ID if available.
|
||||
|
||||
|
||||
#### `request_id` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L318" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `request_id` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L315" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
request_id(self) -> str
|
||||
|
|
@ -216,7 +216,7 @@ Get the unique ID for this request.
|
|||
Raises RuntimeError if MCP request context is not available.
|
||||
|
||||
|
||||
#### `session_id` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L331" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `session_id` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L328" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
session_id(self) -> str
|
||||
|
|
@ -233,7 +233,7 @@ the same client session.
|
|||
- for other transports.
|
||||
|
||||
|
||||
#### `session` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L383" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `session` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L380" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
session(self) -> ServerSession
|
||||
|
|
@ -244,7 +244,7 @@ Access to the underlying session for advanced usage.
|
|||
Raises RuntimeError if MCP request context is not available.
|
||||
|
||||
|
||||
#### `debug` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L396" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `debug` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L393" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
debug(self, message: str, logger_name: str | None = None, extra: Mapping[str, Any] | None = None) -> None
|
||||
|
|
@ -255,7 +255,7 @@ Send a `DEBUG`-level message to the connected MCP Client.
|
|||
Messages sent to Clients are also logged to the `fastmcp.server.context.to_client` logger with a level of `DEBUG`.
|
||||
|
||||
|
||||
#### `info` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L412" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `info` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L409" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
info(self, message: str, logger_name: str | None = None, extra: Mapping[str, Any] | None = None) -> None
|
||||
|
|
@ -266,7 +266,7 @@ Send a `INFO`-level message to the connected MCP Client.
|
|||
Messages sent to Clients are also logged to the `fastmcp.server.context.to_client` logger with a level of `DEBUG`.
|
||||
|
||||
|
||||
#### `warning` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L428" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `warning` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L425" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
warning(self, message: str, logger_name: str | None = None, extra: Mapping[str, Any] | None = None) -> None
|
||||
|
|
@ -277,7 +277,7 @@ Send a `WARNING`-level message to the connected MCP Client.
|
|||
Messages sent to Clients are also logged to the `fastmcp.server.context.to_client` logger with a level of `DEBUG`.
|
||||
|
||||
|
||||
#### `error` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L444" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `error` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L441" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
error(self, message: str, logger_name: str | None = None, extra: Mapping[str, Any] | None = None) -> None
|
||||
|
|
@ -288,7 +288,7 @@ Send a `ERROR`-level message to the connected MCP Client.
|
|||
Messages sent to Clients are also logged to the `fastmcp.server.context.to_client` logger with a level of `DEBUG`.
|
||||
|
||||
|
||||
#### `list_roots` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L460" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `list_roots` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L457" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
list_roots(self) -> list[Root]
|
||||
|
|
@ -297,7 +297,7 @@ list_roots(self) -> list[Root]
|
|||
List the roots available to the server, as indicated by the client.
|
||||
|
||||
|
||||
#### `send_tool_list_changed` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L465" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `send_tool_list_changed` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L462" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
send_tool_list_changed(self) -> None
|
||||
|
|
@ -306,7 +306,7 @@ send_tool_list_changed(self) -> None
|
|||
Send a tool list changed notification to the client.
|
||||
|
||||
|
||||
#### `send_resource_list_changed` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L469" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `send_resource_list_changed` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L466" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
send_resource_list_changed(self) -> None
|
||||
|
|
@ -315,7 +315,7 @@ send_resource_list_changed(self) -> None
|
|||
Send a resource list changed notification to the client.
|
||||
|
||||
|
||||
#### `send_prompt_list_changed` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L473" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `send_prompt_list_changed` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L470" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
send_prompt_list_changed(self) -> None
|
||||
|
|
@ -324,7 +324,7 @@ send_prompt_list_changed(self) -> None
|
|||
Send a prompt list changed notification to the client.
|
||||
|
||||
|
||||
#### `sample` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L477" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `sample` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L474" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
sample(self, messages: str | Sequence[str | SamplingMessage], system_prompt: str | None = None, include_context: IncludeContext | None = None, temperature: float | None = None, max_tokens: int | None = None, model_preferences: ModelPreferences | str | list[str] | None = None) -> TextContent | ImageContent | AudioContent
|
||||
|
|
@ -337,25 +337,25 @@ completion from the client. The client must be appropriately configured,
|
|||
or the request will error.
|
||||
|
||||
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L561" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L558" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
elicit(self, message: str, response_type: None) -> AcceptedElicitation[dict[str, Any]] | DeclinedElicitation | CancelledElicitation
|
||||
```
|
||||
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L573" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L570" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
elicit(self, message: str, response_type: type[T]) -> AcceptedElicitation[T] | DeclinedElicitation | CancelledElicitation
|
||||
```
|
||||
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L583" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L580" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
elicit(self, message: str, response_type: list[str]) -> AcceptedElicitation[str] | DeclinedElicitation | CancelledElicitation
|
||||
```
|
||||
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L592" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `elicit` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L589" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
elicit(self, message: str, response_type: type[T] | list[str] | None = None) -> AcceptedElicitation[T] | AcceptedElicitation[dict[str, Any]] | AcceptedElicitation[str] | DeclinedElicitation | CancelledElicitation
|
||||
|
|
@ -384,16 +384,7 @@ type or dataclass or BaseModel. If it is a primitive type, an
|
|||
object schema with a single "value" field will be generated.
|
||||
|
||||
|
||||
#### `get_http_request` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L683" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_http_request(self) -> Request
|
||||
```
|
||||
|
||||
Get the active starlette request.
|
||||
|
||||
|
||||
#### `set_state` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L698" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `set_state` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L680" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
set_state(self, key: str, value: Any) -> None
|
||||
|
|
@ -402,7 +393,7 @@ set_state(self, key: str, value: Any) -> None
|
|||
Set a value in the context state.
|
||||
|
||||
|
||||
#### `get_state` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L702" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_state` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/context.py#L684" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_state(self, key: str) -> Any
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ sidebarTitle: proxy
|
|||
|
||||
## Functions
|
||||
|
||||
### `default_proxy_roots_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L533" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `default_proxy_roots_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L505" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
default_proxy_roots_handler(context: RequestContext[ClientSession, LifespanContextT]) -> RootsList
|
||||
|
|
@ -19,13 +19,13 @@ A handler that forwards the list roots request from the remote server to the pro
|
|||
|
||||
## Classes
|
||||
|
||||
### `ProxyManagerMixin` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L56" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyManagerMixin` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L54" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A mixin for proxy managers to provide a unified client retrieval method.
|
||||
|
||||
|
||||
### `ProxyToolManager` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L69" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyToolManager` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L67" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A ToolManager that sources its tools from a remote client in addition to local and mounted tools.
|
||||
|
|
@ -33,7 +33,7 @@ A ToolManager that sources its tools from a remote client in addition to local a
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `get_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L76" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L74" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_tools(self) -> dict[str, Tool]
|
||||
|
|
@ -42,7 +42,7 @@ get_tools(self) -> dict[str, Tool]
|
|||
Gets the unfiltered tool inventory including local, mounted, and proxy tools.
|
||||
|
||||
|
||||
#### `list_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L102" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `list_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L100" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
list_tools(self) -> list[Tool]
|
||||
|
|
@ -51,7 +51,7 @@ list_tools(self) -> list[Tool]
|
|||
Gets the filtered list of tools including local, mounted, and proxy tools.
|
||||
|
||||
|
||||
#### `call_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L107" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `call_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L105" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
call_tool(self, key: str, arguments: dict[str, Any]) -> ToolResult
|
||||
|
|
@ -60,7 +60,7 @@ call_tool(self, key: str, arguments: dict[str, Any]) -> ToolResult
|
|||
Calls a tool, trying local/mounted first, then proxy if not found.
|
||||
|
||||
|
||||
### `ProxyResourceManager` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L123" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyResourceManager` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L121" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A ResourceManager that sources its resources from a remote client in addition to local and mounted resources.
|
||||
|
|
@ -68,7 +68,7 @@ A ResourceManager that sources its resources from a remote client in addition to
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `get_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L130" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L128" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_resources(self) -> dict[str, Resource]
|
||||
|
|
@ -77,7 +77,7 @@ get_resources(self) -> dict[str, Resource]
|
|||
Gets the unfiltered resource inventory including local, mounted, and proxy resources.
|
||||
|
||||
|
||||
#### `get_resource_templates` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L153" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_resource_templates` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L151" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_resource_templates(self) -> dict[str, ResourceTemplate]
|
||||
|
|
@ -86,7 +86,7 @@ get_resource_templates(self) -> dict[str, ResourceTemplate]
|
|||
Gets the unfiltered template inventory including local, mounted, and proxy templates.
|
||||
|
||||
|
||||
#### `list_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L176" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `list_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L174" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
list_resources(self) -> list[Resource]
|
||||
|
|
@ -95,7 +95,7 @@ list_resources(self) -> list[Resource]
|
|||
Gets the filtered list of resources including local, mounted, and proxy resources.
|
||||
|
||||
|
||||
#### `list_resource_templates` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L181" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `list_resource_templates` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L179" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
list_resource_templates(self) -> list[ResourceTemplate]
|
||||
|
|
@ -104,7 +104,7 @@ list_resource_templates(self) -> list[ResourceTemplate]
|
|||
Gets the filtered list of templates including local, mounted, and proxy templates.
|
||||
|
||||
|
||||
#### `read_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L186" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `read_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L184" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
read_resource(self, uri: AnyUrl | str) -> str | bytes
|
||||
|
|
@ -113,7 +113,7 @@ read_resource(self, uri: AnyUrl | str) -> str | bytes
|
|||
Reads a resource, trying local/mounted first, then proxy if not found.
|
||||
|
||||
|
||||
### `ProxyPromptManager` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L206" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyPromptManager` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L204" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A PromptManager that sources its prompts from a remote client in addition to local and mounted prompts.
|
||||
|
|
@ -121,7 +121,7 @@ A PromptManager that sources its prompts from a remote client in addition to loc
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `get_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L213" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L211" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_prompts(self) -> dict[str, Prompt]
|
||||
|
|
@ -130,7 +130,7 @@ get_prompts(self) -> dict[str, Prompt]
|
|||
Gets the unfiltered prompt inventory including local, mounted, and proxy prompts.
|
||||
|
||||
|
||||
#### `list_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L236" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `list_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L234" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
list_prompts(self) -> list[Prompt]
|
||||
|
|
@ -139,7 +139,7 @@ list_prompts(self) -> list[Prompt]
|
|||
Gets the filtered list of prompts including local, mounted, and proxy prompts.
|
||||
|
||||
|
||||
#### `render_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L241" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `render_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L239" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
render_prompt(self, name: str, arguments: dict[str, Any] | None = None) -> GetPromptResult
|
||||
|
|
@ -148,7 +148,7 @@ render_prompt(self, name: str, arguments: dict[str, Any] | None = None) -> GetPr
|
|||
Renders a prompt, trying local/mounted first, then proxy if not found.
|
||||
|
||||
|
||||
### `ProxyTool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L258" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyTool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L256" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A Tool that represents and executes a tool on a remote server.
|
||||
|
|
@ -156,7 +156,7 @@ A Tool that represents and executes a tool on a remote server.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `from_mcp_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L268" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_mcp_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L266" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_mcp_tool(cls, client: Client, mcp_tool: mcp.types.Tool) -> ProxyTool
|
||||
|
|
@ -165,7 +165,7 @@ from_mcp_tool(cls, client: Client, mcp_tool: mcp.types.Tool) -> ProxyTool
|
|||
Factory method to create a ProxyTool from a raw MCP tool schema.
|
||||
|
||||
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L284" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L282" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run(self, arguments: dict[str, Any], context: Context | None = None) -> ToolResult
|
||||
|
|
@ -174,7 +174,7 @@ run(self, arguments: dict[str, Any], context: Context | None = None) -> ToolResu
|
|||
Executes the tool by making a call through the client.
|
||||
|
||||
|
||||
### `ProxyResource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L303" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyResource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L301" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A Resource that represents and reads a resource from a remote server.
|
||||
|
|
@ -182,7 +182,7 @@ A Resource that represents and reads a resource from a remote server.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `from_mcp_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L323" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_mcp_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L321" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_mcp_resource(cls, client: Client, mcp_resource: mcp.types.Resource) -> ProxyResource
|
||||
|
|
@ -191,7 +191,7 @@ from_mcp_resource(cls, client: Client, mcp_resource: mcp.types.Resource) -> Prox
|
|||
Factory method to create a ProxyResource from a raw MCP resource schema.
|
||||
|
||||
|
||||
#### `read` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L343" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `read` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L341" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
read(self) -> str | bytes
|
||||
|
|
@ -200,7 +200,7 @@ read(self) -> str | bytes
|
|||
Read the resource content from the remote server.
|
||||
|
||||
|
||||
### `ProxyTemplate` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L358" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyTemplate` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L356" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A ResourceTemplate that represents and creates resources from a remote server template.
|
||||
|
|
@ -208,7 +208,7 @@ A ResourceTemplate that represents and creates resources from a remote server te
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `from_mcp_template` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L368" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_mcp_template` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L366" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_mcp_template(cls, client: Client, mcp_template: mcp.types.ResourceTemplate) -> ProxyTemplate
|
||||
|
|
@ -217,7 +217,7 @@ from_mcp_template(cls, client: Client, mcp_template: mcp.types.ResourceTemplate)
|
|||
Factory method to create a ProxyTemplate from a raw MCP template schema.
|
||||
|
||||
|
||||
#### `create_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L386" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `create_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L384" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
create_resource(self, uri: str, params: dict[str, Any], context: Context | None = None) -> ProxyResource
|
||||
|
|
@ -226,7 +226,7 @@ create_resource(self, uri: str, params: dict[str, Any], context: Context | None
|
|||
Create a resource from the template by calling the remote server.
|
||||
|
||||
|
||||
### `ProxyPrompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L423" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyPrompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L421" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A Prompt that represents and renders a prompt from a remote server.
|
||||
|
|
@ -234,7 +234,7 @@ A Prompt that represents and renders a prompt from a remote server.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `from_mcp_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L435" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_mcp_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L433" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_mcp_prompt(cls, client: Client, mcp_prompt: mcp.types.Prompt) -> ProxyPrompt
|
||||
|
|
@ -243,7 +243,7 @@ from_mcp_prompt(cls, client: Client, mcp_prompt: mcp.types.Prompt) -> ProxyPromp
|
|||
Factory method to create a ProxyPrompt from a raw MCP prompt schema.
|
||||
|
||||
|
||||
#### `render` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L459" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `render` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L457" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
render(self, arguments: dict[str, Any]) -> list[PromptMessage]
|
||||
|
|
@ -252,14 +252,14 @@ render(self, arguments: dict[str, Any]) -> list[PromptMessage]
|
|||
Render the prompt by making a call through the client.
|
||||
|
||||
|
||||
### `FastMCPProxy` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L466" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `FastMCPProxy` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L464" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A FastMCP server that acts as a proxy to a remote MCP-compliant server.
|
||||
It uses specialized managers that fulfill requests via a client factory.
|
||||
|
||||
|
||||
### `ProxyClient` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L543" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ProxyClient` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L515" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A proxy client that forwards advanced interactions between a remote MCP server and the proxy's connected clients.
|
||||
|
|
@ -268,7 +268,7 @@ Supports forwarding roots, sampling, elicitation, logging, and progress.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `default_sampling_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L576" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `default_sampling_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L548" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
default_sampling_handler(cls, messages: list[mcp.types.SamplingMessage], params: mcp.types.CreateMessageRequestParams, context: RequestContext[ClientSession, LifespanContextT]) -> mcp.types.CreateMessageResult
|
||||
|
|
@ -277,7 +277,7 @@ default_sampling_handler(cls, messages: list[mcp.types.SamplingMessage], params:
|
|||
A handler that forwards the sampling request from the remote server to the proxy's connected clients and relays the response back to the remote server.
|
||||
|
||||
|
||||
#### `default_elicitation_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L602" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `default_elicitation_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L574" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
default_elicitation_handler(cls, message: str, response_type: type, params: mcp.types.ElicitRequestParams, context: RequestContext[ClientSession, LifespanContextT]) -> ElicitResult
|
||||
|
|
@ -286,7 +286,7 @@ default_elicitation_handler(cls, message: str, response_type: type, params: mcp.
|
|||
A handler that forwards the elicitation request from the remote server to the proxy's connected clients and relays the response back to the remote server.
|
||||
|
||||
|
||||
#### `default_log_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L621" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `default_log_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L593" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
default_log_handler(cls, message: LogMessage) -> None
|
||||
|
|
@ -295,7 +295,7 @@ default_log_handler(cls, message: LogMessage) -> None
|
|||
A handler that forwards the log notification from the remote server to the proxy's connected clients.
|
||||
|
||||
|
||||
#### `default_progress_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L631" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `default_progress_handler` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L603" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
default_progress_handler(cls, progress: float, total: float | None, message: str | None) -> None
|
||||
|
|
@ -304,7 +304,7 @@ default_progress_handler(cls, progress: float, total: float | None, message: str
|
|||
A handler that forwards the progress notification from the remote server to the proxy's connected clients.
|
||||
|
||||
|
||||
### `StatefulProxyClient` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L644" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `StatefulProxyClient` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L616" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A proxy client that provides a stateful client factory for the proxy server.
|
||||
|
|
@ -318,7 +318,7 @@ Note that it is essential to ensure that the proxy server itself is also statefu
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `clear` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L665" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `clear` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L637" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
clear(self)
|
||||
|
|
@ -327,7 +327,7 @@ clear(self)
|
|||
Clear all cached clients and force disconnect them.
|
||||
|
||||
|
||||
#### `new_stateful` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L673" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `new_stateful` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/proxy.py#L645" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
new_stateful(self) -> Client[ClientTransportT]
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ FastMCP - A more ergonomic interface for MCP servers.
|
|||
|
||||
## Functions
|
||||
|
||||
### `default_lifespan` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L113" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `default_lifespan` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L112" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
default_lifespan(server: FastMCP[LifespanResultT]) -> AsyncIterator[Any]
|
||||
|
|
@ -26,14 +26,14 @@ Default lifespan context manager that does nothing.
|
|||
- An empty dictionary as the lifespan result.
|
||||
|
||||
|
||||
### `add_resource_prefix` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2712" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `add_resource_prefix` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2505" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_resource_prefix(uri: str, prefix: str, prefix_format: Literal['protocol', 'path'] | None = None) -> str
|
||||
add_resource_prefix(uri: str, prefix: str) -> str
|
||||
```
|
||||
|
||||
|
||||
Add a prefix to a resource URI.
|
||||
Add a prefix to a resource URI using path formatting (resource://prefix/path).
|
||||
|
||||
**Args:**
|
||||
- `uri`: The original resource URI
|
||||
|
|
@ -44,16 +44,10 @@ Add a prefix to a resource URI.
|
|||
|
||||
**Examples:**
|
||||
|
||||
With new style:
|
||||
```python
|
||||
add_resource_prefix("resource://path/to/resource", "prefix")
|
||||
"resource://prefix/path/to/resource"
|
||||
```
|
||||
With legacy style:
|
||||
```python
|
||||
add_resource_prefix("resource://path/to/resource", "prefix")
|
||||
"prefix+resource://path/to/resource"
|
||||
```
|
||||
With absolute path:
|
||||
```python
|
||||
add_resource_prefix("resource:///absolute/path", "prefix")
|
||||
|
|
@ -64,10 +58,10 @@ add_resource_prefix("resource:///absolute/path", "prefix")
|
|||
- `ValueError`: If the URI doesn't match the expected protocol\://path format
|
||||
|
||||
|
||||
### `remove_resource_prefix` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2772" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `remove_resource_prefix` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2543" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
remove_resource_prefix(uri: str, prefix: str, prefix_format: Literal['protocol', 'path'] | None = None) -> str
|
||||
remove_resource_prefix(uri: str, prefix: str) -> str
|
||||
```
|
||||
|
||||
|
||||
|
|
@ -76,23 +70,16 @@ Remove a prefix from a resource URI.
|
|||
**Args:**
|
||||
- `uri`: The resource URI with a prefix
|
||||
- `prefix`: The prefix to remove
|
||||
- `prefix_format`: The format of the prefix to remove
|
||||
|
||||
Returns:
|
||||
The resource URI with the prefix removed
|
||||
**Returns:**
|
||||
- The resource URI with the prefix removed
|
||||
|
||||
**Examples:**
|
||||
|
||||
With new style:
|
||||
```python
|
||||
remove_resource_prefix("resource://prefix/path/to/resource", "prefix")
|
||||
"resource://path/to/resource"
|
||||
```
|
||||
With legacy style:
|
||||
```python
|
||||
remove_resource_prefix("prefix+resource://path/to/resource", "prefix")
|
||||
"resource://path/to/resource"
|
||||
```
|
||||
With absolute path:
|
||||
```python
|
||||
remove_resource_prefix("resource://prefix//absolute/path", "prefix")
|
||||
|
|
@ -103,10 +90,10 @@ remove_resource_prefix("resource://prefix//absolute/path", "prefix")
|
|||
- `ValueError`: If the URI doesn't match the expected protocol\://path format
|
||||
|
||||
|
||||
### `has_resource_prefix` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2839" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `has_resource_prefix` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2587" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
has_resource_prefix(uri: str, prefix: str, prefix_format: Literal['protocol', 'path'] | None = None) -> bool
|
||||
has_resource_prefix(uri: str, prefix: str) -> bool
|
||||
```
|
||||
|
||||
|
||||
|
|
@ -121,16 +108,10 @@ Check if a resource URI has a specific prefix.
|
|||
|
||||
**Examples:**
|
||||
|
||||
With new style:
|
||||
```python
|
||||
has_resource_prefix("resource://prefix/path/to/resource", "prefix")
|
||||
True
|
||||
```
|
||||
With legacy style:
|
||||
```python
|
||||
has_resource_prefix("prefix+resource://path/to/resource", "prefix")
|
||||
True
|
||||
```
|
||||
With other path:
|
||||
```python
|
||||
has_resource_prefix("resource://other/path/to/resource", "prefix")
|
||||
|
|
@ -143,53 +124,53 @@ False
|
|||
|
||||
## Classes
|
||||
|
||||
### `FastMCP` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L149" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `FastMCP` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L148" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
**Methods:**
|
||||
|
||||
#### `settings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L349" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `settings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L324" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
settings(self) -> Settings
|
||||
```
|
||||
|
||||
#### `name` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L360" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `name` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L335" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
name(self) -> str
|
||||
```
|
||||
|
||||
#### `instructions` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L364" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `instructions` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L339" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
instructions(self) -> str | None
|
||||
```
|
||||
|
||||
#### `instructions` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L368" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `instructions` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L343" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
instructions(self, value: str | None) -> None
|
||||
```
|
||||
|
||||
#### `version` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L372" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `version` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L347" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
version(self) -> str | None
|
||||
```
|
||||
|
||||
#### `website_url` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L376" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `website_url` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L351" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
website_url(self) -> str | None
|
||||
```
|
||||
|
||||
#### `icons` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L380" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `icons` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L355" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
icons(self) -> list[mcp.types.Icon]
|
||||
```
|
||||
|
||||
#### `run_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L407" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L382" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run_async(self, transport: Transport | None = None, show_banner: bool = True, **transport_kwargs: Any) -> None
|
||||
|
|
@ -201,7 +182,7 @@ Run the FastMCP server asynchronously.
|
|||
- `transport`: Transport protocol to use ("stdio", "sse", or "streamable-http")
|
||||
|
||||
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L437" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L412" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run(self, transport: Transport | None = None, show_banner: bool = True, **transport_kwargs: Any) -> None
|
||||
|
|
@ -213,13 +194,13 @@ Run the FastMCP server. Note this is a synchronous function.
|
|||
- `transport`: Transport protocol to use ("stdio", "sse", or "streamable-http")
|
||||
|
||||
|
||||
#### `add_middleware` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L481" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `add_middleware` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L456" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_middleware(self, middleware: Middleware) -> None
|
||||
```
|
||||
|
||||
#### `get_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L484" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L459" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_tools(self) -> dict[str, Tool]
|
||||
|
|
@ -228,13 +209,13 @@ get_tools(self) -> dict[str, Tool]
|
|||
Get all tools (unfiltered), including mounted servers, indexed by key.
|
||||
|
||||
|
||||
#### `get_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L504" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L479" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_tool(self, key: str) -> Tool
|
||||
```
|
||||
|
||||
#### `get_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L510" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L485" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_resources(self) -> dict[str, Resource]
|
||||
|
|
@ -243,13 +224,13 @@ get_resources(self) -> dict[str, Resource]
|
|||
Get all resources (unfiltered), including mounted servers, indexed by key.
|
||||
|
||||
|
||||
#### `get_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L543" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L516" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_resource(self, key: str) -> Resource
|
||||
```
|
||||
|
||||
#### `get_resource_templates` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L549" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_resource_templates` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L522" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_resource_templates(self) -> dict[str, ResourceTemplate]
|
||||
|
|
@ -258,7 +239,7 @@ get_resource_templates(self) -> dict[str, ResourceTemplate]
|
|||
Get all resource templates (unfiltered), including mounted servers, indexed by key.
|
||||
|
||||
|
||||
#### `get_resource_template` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L582" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_resource_template` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L553" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_resource_template(self, key: str) -> ResourceTemplate
|
||||
|
|
@ -267,7 +248,7 @@ get_resource_template(self, key: str) -> ResourceTemplate
|
|||
Get a registered resource template by key.
|
||||
|
||||
|
||||
#### `get_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L589" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L560" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_prompts(self) -> dict[str, Prompt]
|
||||
|
|
@ -276,13 +257,13 @@ get_prompts(self) -> dict[str, Prompt]
|
|||
Get all prompts (unfiltered), including mounted servers, indexed by key.
|
||||
|
||||
|
||||
#### `get_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L609" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L580" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_prompt(self, key: str) -> Prompt
|
||||
```
|
||||
|
||||
#### `custom_route` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L615" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `custom_route` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L586" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
custom_route(self, path: str, methods: list[str], name: str | None = None, include_in_schema: bool = True) -> Callable[[Callable[[Request], Awaitable[Response]]], Callable[[Request], Awaitable[Response]]]
|
||||
|
|
@ -303,7 +284,7 @@ Starlette's reverse URL lookup feature)
|
|||
- `include_in_schema`: Whether to include in OpenAPI schema, defaults to True
|
||||
|
||||
|
||||
#### `add_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1313" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `add_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1272" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_tool(self, tool: Tool) -> Tool
|
||||
|
|
@ -321,7 +302,7 @@ with the Context type annotation. See the @tool decorator for examples.
|
|||
- The tool instance that was added to the server.
|
||||
|
||||
|
||||
#### `remove_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1338" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `remove_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1297" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
remove_tool(self, name: str) -> None
|
||||
|
|
@ -336,7 +317,7 @@ Remove a tool from the server.
|
|||
- `NotFoundError`: If the tool is not found
|
||||
|
||||
|
||||
#### `add_tool_transformation` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1358" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `add_tool_transformation` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1317" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_tool_transformation(self, tool_name: str, transformation: ToolTransformConfig) -> None
|
||||
|
|
@ -345,7 +326,7 @@ add_tool_transformation(self, tool_name: str, transformation: ToolTransformConfi
|
|||
Add a tool transformation.
|
||||
|
||||
|
||||
#### `remove_tool_transformation` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1364" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `remove_tool_transformation` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1323" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
remove_tool_transformation(self, tool_name: str) -> None
|
||||
|
|
@ -354,19 +335,19 @@ remove_tool_transformation(self, tool_name: str) -> None
|
|||
Remove a tool transformation.
|
||||
|
||||
|
||||
#### `tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1369" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1328" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
tool(self, name_or_fn: AnyFunction) -> FunctionTool
|
||||
```
|
||||
|
||||
#### `tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1386" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1345" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
tool(self, name_or_fn: str | None = None) -> Callable[[AnyFunction], FunctionTool]
|
||||
```
|
||||
|
||||
#### `tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1402" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1361" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
tool(self, name_or_fn: str | AnyFunction | None = None) -> Callable[[AnyFunction], FunctionTool] | FunctionTool
|
||||
|
|
@ -424,7 +405,7 @@ server.tool(my_function, name="custom_name")
|
|||
```
|
||||
|
||||
|
||||
#### `add_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1539" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `add_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1498" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_resource(self, resource: Resource) -> Resource
|
||||
|
|
@ -439,7 +420,7 @@ Add a resource to the server.
|
|||
- The resource instance that was added to the server.
|
||||
|
||||
|
||||
#### `add_template` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1561" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `add_template` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1520" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_template(self, template: ResourceTemplate) -> ResourceTemplate
|
||||
|
|
@ -454,27 +435,7 @@ Add a resource template to the server.
|
|||
- The template instance that was added to the server.
|
||||
|
||||
|
||||
#### `add_resource_fn` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1583" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_resource_fn(self, fn: AnyFunction, uri: str, name: str | None = None, description: str | None = None, mime_type: str | None = None, tags: set[str] | None = None) -> None
|
||||
```
|
||||
|
||||
Add a resource or template to the server from a function.
|
||||
|
||||
If the URI contains parameters (e.g. "resource://{param}") or the function
|
||||
has parameters, it will be registered as a template resource.
|
||||
|
||||
**Args:**
|
||||
- `fn`: The function to register as a resource
|
||||
- `uri`: The URI for the resource
|
||||
- `name`: Optional name for the resource
|
||||
- `description`: Optional description of the resource
|
||||
- `mime_type`: Optional MIME type for the resource
|
||||
- `tags`: Optional set of tags for categorizing the resource
|
||||
|
||||
|
||||
#### `resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1621" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1542" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
resource(self, uri: str) -> Callable[[AnyFunction], Resource | ResourceTemplate]
|
||||
|
|
@ -534,7 +495,7 @@ async def get_weather(city: str) -> str:
|
|||
```
|
||||
|
||||
|
||||
#### `add_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1761" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `add_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1682" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
add_prompt(self, prompt: Prompt) -> Prompt
|
||||
|
|
@ -549,19 +510,19 @@ Add a prompt to the server.
|
|||
- The prompt instance that was added to the server.
|
||||
|
||||
|
||||
#### `prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1784" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1705" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
prompt(self, name_or_fn: AnyFunction) -> FunctionPrompt
|
||||
```
|
||||
|
||||
#### `prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1798" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1719" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
prompt(self, name_or_fn: str | None = None) -> Callable[[AnyFunction], FunctionPrompt]
|
||||
```
|
||||
|
||||
#### `prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1811" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1732" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
prompt(self, name_or_fn: str | AnyFunction | None = None) -> Callable[[AnyFunction], FunctionPrompt] | FunctionPrompt
|
||||
|
|
@ -639,7 +600,7 @@ Decorator to register a prompt.
|
|||
```
|
||||
|
||||
|
||||
#### `run_stdio_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1955" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run_stdio_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1876" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run_stdio_async(self, show_banner: bool = True, log_level: str | None = None) -> None
|
||||
|
|
@ -652,7 +613,7 @@ Run the server using stdio transport.
|
|||
- `log_level`: Log level for the server
|
||||
|
||||
|
||||
#### `run_http_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1985" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run_http_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1906" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run_http_async(self, show_banner: bool = True, transport: Literal['http', 'streamable-http', 'sse'] = 'http', host: str | None = None, port: int | None = None, log_level: str | None = None, path: str | None = None, uvicorn_config: dict[str, Any] | None = None, middleware: list[ASGIMiddleware] | None = None, json_response: bool | None = None, stateless_http: bool | None = None) -> None
|
||||
|
|
@ -672,43 +633,7 @@ Run the server using HTTP transport.
|
|||
- `stateless_http`: Whether to use stateless HTTP (defaults to settings.stateless_http)
|
||||
|
||||
|
||||
#### `run_sse_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2064" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run_sse_async(self, host: str | None = None, port: int | None = None, log_level: str | None = None, path: str | None = None, uvicorn_config: dict[str, Any] | None = None) -> None
|
||||
```
|
||||
|
||||
Run the server using SSE transport.
|
||||
|
||||
|
||||
#### `sse_app` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2092" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
sse_app(self, path: str | None = None, message_path: str | None = None, middleware: list[ASGIMiddleware] | None = None) -> StarletteWithLifespan
|
||||
```
|
||||
|
||||
Create a Starlette app for the SSE server.
|
||||
|
||||
**Args:**
|
||||
- `path`: The path to the SSE endpoint
|
||||
- `message_path`: The path to the message endpoint
|
||||
- `middleware`: A list of middleware to apply to the app
|
||||
|
||||
|
||||
#### `streamable_http_app` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2123" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
streamable_http_app(self, path: str | None = None, middleware: list[ASGIMiddleware] | None = None) -> StarletteWithLifespan
|
||||
```
|
||||
|
||||
Create a Starlette app for the StreamableHTTP server.
|
||||
|
||||
**Args:**
|
||||
- `path`: The path to the StreamableHTTP endpoint
|
||||
- `middleware`: A list of middleware to apply to the app
|
||||
|
||||
|
||||
#### `http_app` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2144" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `http_app` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L1985" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
http_app(self, path: str | None = None, middleware: list[ASGIMiddleware] | None = None, json_response: bool | None = None, stateless_http: bool | None = None, transport: Literal['http', 'streamable-http', 'sse'] = 'http') -> StarletteWithLifespan
|
||||
|
|
@ -725,13 +650,7 @@ Create a Starlette app using the specified HTTP transport.
|
|||
- A Starlette application configured with the specified transport
|
||||
|
||||
|
||||
#### `run_streamable_http_async` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2193" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run_streamable_http_async(self, host: str | None = None, port: int | None = None, log_level: str | None = None, path: str | None = None, uvicorn_config: dict[str, Any] | None = None) -> None
|
||||
```
|
||||
|
||||
#### `mount` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2218" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `mount` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2034" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
mount(self, server: FastMCP[LifespanResultT], prefix: str | None = None, as_proxy: bool | None = None) -> None
|
||||
|
|
@ -785,7 +704,7 @@ automatically determined based on whether the server has a custom lifespan
|
|||
- `prompt_separator`: Deprecated. Separator character for prompt names.
|
||||
|
||||
|
||||
#### `import_server` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2337" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `import_server` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2152" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
import_server(self, server: FastMCP[LifespanResultT], prefix: str | None = None, tool_separator: str | None = None, resource_separator: str | None = None, prompt_separator: str | None = None) -> None
|
||||
|
|
@ -826,7 +745,7 @@ applied using the protocol\://prefix/path format
|
|||
- `prompt_separator`: Deprecated. Separator for prompt names.
|
||||
|
||||
|
||||
#### `from_openapi` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2475" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_openapi` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2286" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_openapi(cls, openapi_spec: dict[str, Any], client: httpx.AsyncClient, route_maps: list[RouteMap] | list[RouteMapNew] | None = None, route_map_fn: OpenAPIRouteMapFn | OpenAPIRouteMapFnNew | None = None, mcp_component_fn: OpenAPIComponentFn | OpenAPIComponentFnNew | None = None, mcp_names: dict[str, str] | None = None, tags: set[str] | None = None, **settings: Any) -> FastMCPOpenAPI | FastMCPOpenAPINew
|
||||
|
|
@ -835,7 +754,7 @@ from_openapi(cls, openapi_spec: dict[str, Any], client: httpx.AsyncClient, route
|
|||
Create a FastMCP server from an OpenAPI specification.
|
||||
|
||||
|
||||
#### `from_fastapi` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2524" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_fastapi` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2335" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_fastapi(cls, app: Any, name: str | None = None, route_maps: list[RouteMap] | list[RouteMapNew] | None = None, route_map_fn: OpenAPIRouteMapFn | OpenAPIRouteMapFnNew | None = None, mcp_component_fn: OpenAPIComponentFn | OpenAPIComponentFnNew | None = None, mcp_names: dict[str, str] | None = None, httpx_client_kwargs: dict[str, Any] | None = None, tags: set[str] | None = None, **settings: Any) -> FastMCPOpenAPI | FastMCPOpenAPINew
|
||||
|
|
@ -844,7 +763,7 @@ from_fastapi(cls, app: Any, name: str | None = None, route_maps: list[RouteMap]
|
|||
Create a FastMCP server from a FastAPI application.
|
||||
|
||||
|
||||
#### `as_proxy` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2587" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `as_proxy` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2398" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
as_proxy(cls, backend: Client[ClientTransportT] | ClientTransport | FastMCP[Any] | FastMCP1Server | AnyUrl | Path | MCPConfig | dict[str, Any] | str, **settings: Any) -> FastMCPProxy
|
||||
|
|
@ -858,19 +777,10 @@ instance or any value accepted as the `transport` argument of
|
|||
`fastmcp.client.Client` constructor.
|
||||
|
||||
|
||||
#### `from_client` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2647" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_client(cls, client: Client[ClientTransportT], **settings: Any) -> FastMCPProxy
|
||||
```
|
||||
|
||||
Create a FastMCP proxy server from a FastMCP client.
|
||||
|
||||
|
||||
#### `generate_name` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2696" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `generate_name` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2490" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
generate_name(cls, name: str | None = None) -> str
|
||||
```
|
||||
|
||||
### `MountedServer` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2706" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `MountedServer` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/server/server.py#L2500" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
|
|
|||
|
|
@ -7,27 +7,9 @@ sidebarTitle: settings
|
|||
|
||||
## Classes
|
||||
|
||||
### `ExtendedEnvSettingsSource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L36" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ExperimentalSettings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L33" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A special EnvSettingsSource that allows for multiple env var prefixes to be used.
|
||||
|
||||
Raises a deprecation warning if the old `FASTMCP_SERVER_` prefix is used.
|
||||
|
||||
|
||||
**Methods:**
|
||||
|
||||
#### `get_field_value` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L43" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str, bool]
|
||||
```
|
||||
|
||||
### `ExtendedSettingsConfigDict` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L63" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
### `ExperimentalSettings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L67" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
### `Settings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L86" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `Settings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L52" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
FastMCP settings.
|
||||
|
|
@ -35,7 +17,7 @@ FastMCP settings.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `get_setting` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L98" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `get_setting` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L64" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
get_setting(self, attr: str) -> Any
|
||||
|
|
@ -45,7 +27,7 @@ Get a setting. If the setting contains one or more `__`, it will be
|
|||
treated as a nested setting.
|
||||
|
||||
|
||||
#### `set_setting` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L111" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `set_setting` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L77" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
set_setting(self, attr: str, value: Any) -> None
|
||||
|
|
@ -55,13 +37,7 @@ Set a setting. If the setting contains one or more `__`, it will be
|
|||
treated as a nested setting.
|
||||
|
||||
|
||||
#### `settings_customise_sources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L125" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
settings_customise_sources(cls, settings_cls: type[BaseSettings], init_settings: PydanticBaseSettingsSource, env_settings: PydanticBaseSettingsSource, dotenv_settings: PydanticBaseSettingsSource, file_secret_settings: PydanticBaseSettingsSource) -> tuple[PydanticBaseSettingsSource, ...]
|
||||
```
|
||||
|
||||
#### `settings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L143" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `settings` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L91" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
settings(self) -> Self
|
||||
|
|
@ -71,13 +47,13 @@ This property is for backwards compatibility with FastMCP < 2.8.0,
|
|||
which accessed fastmcp.settings.settings
|
||||
|
||||
|
||||
#### `normalize_log_level` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L163" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `normalize_log_level` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L111" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
normalize_log_level(cls, v)
|
||||
```
|
||||
|
||||
#### `server_auth_class` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L378" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `server_auth_class` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/settings.py#L313" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
server_auth_class(self) -> AuthProvider | None
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ sidebarTitle: tool
|
|||
|
||||
## Functions
|
||||
|
||||
### `default_serializer` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L63" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `default_serializer` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L60" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
default_serializer(data: Any) -> str
|
||||
|
|
@ -15,17 +15,17 @@ default_serializer(data: Any) -> str
|
|||
|
||||
## Classes
|
||||
|
||||
### `ToolResult` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L67" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ToolResult` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L64" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
**Methods:**
|
||||
|
||||
#### `to_mcp_result` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L100" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `to_mcp_result` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L97" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
to_mcp_result(self) -> list[ContentBlock] | tuple[list[ContentBlock], dict[str, Any]] | CallToolResult
|
||||
```
|
||||
|
||||
### `Tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L116" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `Tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L113" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
Internal tool registration info.
|
||||
|
|
@ -33,19 +33,19 @@ Internal tool registration info.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `enable` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L134" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `enable` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L131" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
enable(self) -> None
|
||||
```
|
||||
|
||||
#### `disable` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L142" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `disable` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L139" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
disable(self) -> None
|
||||
```
|
||||
|
||||
#### `to_mcp_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L150" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `to_mcp_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L147" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
to_mcp_tool(self, **overrides: Any) -> MCPTool
|
||||
|
|
@ -54,16 +54,16 @@ to_mcp_tool(self, **overrides: Any) -> MCPTool
|
|||
Convert the FastMCP tool to an MCP tool.
|
||||
|
||||
|
||||
#### `from_function` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L178" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_function` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L175" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_function(fn: Callable[..., Any], name: str | None = None, title: str | None = None, description: str | None = None, icons: list[Icon] | None = None, tags: set[str] | None = None, annotations: ToolAnnotations | None = None, exclude_args: list[str] | None = None, output_schema: dict[str, Any] | Literal[False] | NotSetT | None = NotSet, serializer: ToolResultSerializerType | None = None, meta: dict[str, Any] | None = None, enabled: bool | None = None) -> FunctionTool
|
||||
from_function(fn: Callable[..., Any], name: str | None = None, title: str | None = None, description: str | None = None, icons: list[Icon] | None = None, tags: set[str] | None = None, annotations: ToolAnnotations | None = None, exclude_args: list[str] | None = None, output_schema: dict[str, Any] | NotSetT | None = NotSet, serializer: ToolResultSerializerType | None = None, meta: dict[str, Any] | None = None, enabled: bool | None = None) -> FunctionTool
|
||||
```
|
||||
|
||||
Create a Tool from a function.
|
||||
|
||||
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L208" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L205" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run(self, arguments: dict[str, Any]) -> ToolResult
|
||||
|
|
@ -78,26 +78,26 @@ implemented by subclasses.
|
|||
(list of ContentBlocks, dict of structured output).
|
||||
|
||||
|
||||
#### `from_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L221" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L218" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_tool(cls, tool: Tool) -> TransformedTool
|
||||
```
|
||||
|
||||
### `FunctionTool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L255" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `FunctionTool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L252" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
**Methods:**
|
||||
|
||||
#### `from_function` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L259" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_function` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L256" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_function(cls, fn: Callable[..., Any], name: str | None = None, title: str | None = None, description: str | None = None, icons: list[Icon] | None = None, tags: set[str] | None = None, annotations: ToolAnnotations | None = None, exclude_args: list[str] | None = None, output_schema: dict[str, Any] | Literal[False] | NotSetT | None = NotSet, serializer: ToolResultSerializerType | None = None, meta: dict[str, Any] | None = None, enabled: bool | None = None) -> FunctionTool
|
||||
from_function(cls, fn: Callable[..., Any], name: str | None = None, title: str | None = None, description: str | None = None, icons: list[Icon] | None = None, tags: set[str] | None = None, annotations: ToolAnnotations | None = None, exclude_args: list[str] | None = None, output_schema: dict[str, Any] | NotSetT | None = NotSet, serializer: ToolResultSerializerType | None = None, meta: dict[str, Any] | None = None, enabled: bool | None = None) -> FunctionTool
|
||||
```
|
||||
|
||||
Create a Tool from a function.
|
||||
|
||||
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L330" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L318" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run(self, arguments: dict[str, Any]) -> ToolResult
|
||||
|
|
@ -106,11 +106,11 @@ run(self, arguments: dict[str, Any]) -> ToolResult
|
|||
Run the tool with arguments.
|
||||
|
||||
|
||||
### `ParsedFunction` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L397" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ParsedFunction` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L385" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
**Methods:**
|
||||
|
||||
#### `from_function` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L405" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_function` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool.py#L393" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_function(cls, fn: Callable[..., Any], exclude_args: list[str] | None = None, validate: bool = True, wrap_non_object_output_schema: bool = True) -> ParsedFunction
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ sidebarTitle: tool_transform
|
|||
|
||||
## Functions
|
||||
|
||||
### `forward` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L38" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `forward` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L36" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
forward(**kwargs: Any) -> ToolResult
|
||||
|
|
@ -36,7 +36,7 @@ tool has args `a` and `b`, and an `transform_args` was provided that maps `x` to
|
|||
- `TypeError`: If provided arguments don't match the transformed schema.
|
||||
|
||||
|
||||
### `forward_raw` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L68" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `forward_raw` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L66" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
forward_raw(**kwargs: Any) -> ToolResult
|
||||
|
|
@ -62,7 +62,7 @@ y=2)` will call the parent tool with `x=1` and `y=2`.
|
|||
- `RuntimeError`: If called outside a transformed tool context.
|
||||
|
||||
|
||||
### `apply_transformations_to_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L935" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `apply_transformations_to_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L924" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
apply_transformations_to_tools(tools: dict[str, Tool], transformations: dict[str, ToolTransformConfig]) -> dict[str, Tool]
|
||||
|
|
@ -75,7 +75,7 @@ are left unchanged.
|
|||
|
||||
## Classes
|
||||
|
||||
### `ArgTransform` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L95" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ArgTransform` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L93" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
Configuration for transforming a parent tool's argument.
|
||||
|
|
@ -137,7 +137,7 @@ ArgTransform(name="new_name", description="New desc", default=None, type=int)
|
|||
```
|
||||
|
||||
|
||||
### `ArgTransformConfig` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L209" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ArgTransformConfig` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L207" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A model for requesting a single argument transform.
|
||||
|
|
@ -145,7 +145,7 @@ A model for requesting a single argument transform.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `to_arg_transform` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L227" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `to_arg_transform` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L225" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
to_arg_transform(self) -> ArgTransform
|
||||
|
|
@ -154,7 +154,7 @@ to_arg_transform(self) -> ArgTransform
|
|||
Convert the argument transform to a FastMCP argument transform.
|
||||
|
||||
|
||||
### `TransformedTool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L233" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `TransformedTool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L231" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
A tool that is transformed from another tool.
|
||||
|
|
@ -171,7 +171,7 @@ inherited from the parent tool but can be overridden or disabled.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L260" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `run` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L258" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
run(self, arguments: dict[str, Any]) -> ToolResult
|
||||
|
|
@ -190,10 +190,10 @@ functions.
|
|||
- ToolResult object containing content and optional structured output.
|
||||
|
||||
|
||||
#### `from_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L365" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `from_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L363" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
from_tool(cls, tool: Tool, name: str | None = None, title: str | NotSetT | None = NotSet, description: str | NotSetT | None = NotSet, tags: set[str] | None = None, transform_fn: Callable[..., Any] | None = None, transform_args: dict[str, ArgTransform] | None = None, annotations: ToolAnnotations | NotSetT | None = NotSet, output_schema: dict[str, Any] | Literal[False] | NotSetT | None = NotSet, serializer: Callable[[Any], str] | NotSetT | None = NotSet, meta: dict[str, Any] | NotSetT | None = NotSet, enabled: bool | None = None) -> TransformedTool
|
||||
from_tool(cls, tool: Tool, name: str | None = None, title: str | NotSetT | None = NotSet, description: str | NotSetT | None = NotSet, tags: set[str] | None = None, transform_fn: Callable[..., Any] | None = None, transform_args: dict[str, ArgTransform] | None = None, annotations: ToolAnnotations | NotSetT | None = NotSet, output_schema: dict[str, Any] | NotSetT | None = NotSet, serializer: Callable[[Any], str] | NotSetT | None = NotSet, meta: dict[str, Any] | NotSetT | None = NotSet, enabled: bool | None = None) -> TransformedTool
|
||||
```
|
||||
|
||||
Create a transformed tool from a parent tool.
|
||||
|
|
@ -272,7 +272,7 @@ async def custom_output(**kwargs) -> ToolResult:
|
|||
```
|
||||
|
||||
|
||||
### `ToolTransformConfig` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L889" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
### `ToolTransformConfig` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L878" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
|
||||
Provides a way to transform a tool.
|
||||
|
|
@ -280,7 +280,7 @@ Provides a way to transform a tool.
|
|||
|
||||
**Methods:**
|
||||
|
||||
#### `apply` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L921" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
#### `apply` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L910" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
||||
|
||||
```python
|
||||
apply(self, tool: Tool) -> TransformedTool
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ FastMCP supports [MCP proxying](/servers/proxy), which allows you to mirror a lo
|
|||
|
||||
You can also create proxies from configuration dictionaries that follow the MCPConfig schema, which is useful for quickly connecting to one or more remote servers. See the [Proxy Servers documentation](/servers/proxy#configuration-based-proxies) for details on configuration-based proxying. Note that MCPConfig follows an emerging standard and its format may evolve over time.
|
||||
|
||||
Prefixing rules for tools, prompts, resources, and templates are identical across importing, mounting, and proxies.
|
||||
Prefixing rules for tools, prompts, resources, and templates are identical across importing, mounting, and proxies. When prefixes are used, resource URIs are prefixed using path format (since 2.4.0): `resource://prefix/path/to/resource`.
|
||||
|
||||
## Importing (Static Composition)
|
||||
|
||||
|
|
@ -207,6 +207,10 @@ The same prefixing rules apply as with `import_server` for naming tools, resourc
|
|||
The `prefix` parameter is optional. If omitted, components are mounted without modification.
|
||||
</Tip>
|
||||
|
||||
<Note>
|
||||
When mounting servers, custom HTTP routes defined with `@server.custom_route()` are also forwarded to the parent server, making them accessible through the parent's HTTP application.
|
||||
</Note>
|
||||
|
||||
#### Performance Considerations
|
||||
|
||||
Due to the "live link", operations like `list_tools()` on the parent server will be impacted by the speed of the slowest mounted server. In particular, HTTP-based mounted servers can introduce significant latency (300-400ms vs 1-2ms for local tools), and this slowdown affects the whole server, not just interactions with the HTTP-proxied tools. If performance is important, importing tools via [`import_server()`](#importing-static-composition) may be a more appropriate solution as it copies components once at startup rather than delegating requests at runtime.
|
||||
|
|
@ -320,62 +324,3 @@ This ensures that parent server tag policies act as a global policy for everythi
|
|||
<Note>
|
||||
This filtering applies to both **listing** (e.g., `list_tools()`) and **execution** (e.g., `call_tool()`). Filtered components are neither visible nor executable through the parent server.
|
||||
</Note>
|
||||
|
||||
## Resource Prefix Formats
|
||||
|
||||
<VersionBadge version="2.4.0" />
|
||||
|
||||
When mounting or importing servers, resource URIs are usually prefixed to avoid naming conflicts. FastMCP supports two different formats for resource prefixes:
|
||||
|
||||
### Path Format (Default)
|
||||
|
||||
In path format, prefixes are added to the path component of the URI:
|
||||
|
||||
```
|
||||
resource://prefix/path/to/resource
|
||||
```
|
||||
|
||||
This is the default format since FastMCP 2.4. This format is recommended because it avoids issues with URI protocol restrictions (like underscores not being allowed in protocol names).
|
||||
|
||||
### Protocol Format (Legacy)
|
||||
|
||||
In protocol format, prefixes are added as part of the protocol:
|
||||
|
||||
```
|
||||
prefix+resource://path/to/resource
|
||||
```
|
||||
|
||||
This was the default format in FastMCP before 2.4. While still supported, it's not recommended for new code as it can cause problems with prefix names that aren't valid in URI protocols.
|
||||
|
||||
### Configuring the Prefix Format
|
||||
|
||||
You can configure the prefix format globally in code:
|
||||
|
||||
```python
|
||||
import fastmcp
|
||||
fastmcp.settings.resource_prefix_format = "protocol"
|
||||
```
|
||||
|
||||
Or via environment variable:
|
||||
|
||||
```bash
|
||||
FASTMCP_RESOURCE_PREFIX_FORMAT=protocol
|
||||
```
|
||||
|
||||
Or per-server:
|
||||
|
||||
```python
|
||||
from fastmcp import FastMCP
|
||||
|
||||
# Create a server that uses legacy protocol format
|
||||
server = FastMCP("LegacyServer", resource_prefix_format="protocol")
|
||||
|
||||
# Create a server that uses new path format
|
||||
server = FastMCP("NewServer", resource_prefix_format="path")
|
||||
```
|
||||
|
||||
When mounting or importing servers, the prefix format of the parent server is used.
|
||||
|
||||
<Note>
|
||||
When mounting servers, custom HTTP routes defined with `@server.custom_route()` are also forwarded to the parent server, making them accessible through the parent's HTTP application.
|
||||
</Note>
|
||||
|
|
|
|||
|
|
@ -266,8 +266,6 @@ These rules apply uniformly whether you:
|
|||
- Create a multi-server proxy from an `MCPConfig`
|
||||
- Use `FastMCP.as_proxy()` directly
|
||||
|
||||
For resource URI prefix formats (path vs legacy protocol style) and configuration options, see Server Composition → Resource Prefix Formats.
|
||||
|
||||
## Mirrored Components
|
||||
|
||||
<VersionBadge version="2.10.5" />
|
||||
|
|
@ -317,7 +315,6 @@ proxy = FastMCPProxy(client_factory=create_client)
|
|||
|
||||
### Parameters
|
||||
|
||||
- **`client`**: **[DEPRECATED]** A `Client` instance. Use `client_factory` instead for explicit session management.
|
||||
- **`client_factory`**: A callable that returns a `Client` instance when called. This gives you full control over session creation and reuse strategies.
|
||||
|
||||
### Explicit Session Management
|
||||
|
|
|
|||
|
|
@ -357,7 +357,6 @@ import fastmcp
|
|||
# Access global settings
|
||||
print(fastmcp.settings.log_level) # Default: "INFO"
|
||||
print(fastmcp.settings.mask_error_details) # Default: False
|
||||
print(fastmcp.settings.resource_prefix_format) # Default: "path"
|
||||
print(fastmcp.settings.strict_input_validation) # Default: False
|
||||
print(fastmcp.settings.include_fastmcp_meta) # Default: True
|
||||
```
|
||||
|
|
@ -365,7 +364,6 @@ print(fastmcp.settings.include_fastmcp_meta) # Default: True
|
|||
Common global settings include:
|
||||
- **`log_level`**: Logging level ("DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"), set with `FASTMCP_LOG_LEVEL`
|
||||
- **`mask_error_details`**: Whether to hide detailed error information from clients, set with `FASTMCP_MASK_ERROR_DETAILS`
|
||||
- **`resource_prefix_format`**: How to format resource prefixes ("path" or "protocol"), set with `FASTMCP_RESOURCE_PREFIX_FORMAT`
|
||||
- **`strict_input_validation`**: Controls tool input validation mode (default: False for flexible coercion), set with `FASTMCP_STRICT_INPUT_VALIDATION`. See [Input Validation Modes](/servers/tools#input-validation-modes)
|
||||
- **`include_fastmcp_meta`**: Whether to include FastMCP metadata in component responses (default: True), set with `FASTMCP_INCLUDE_FASTMCP_META`
|
||||
- **`env_file`**: Path to the environment file to load settings from (default: ".env"), set with `FASTMCP_ENV_FILE`. Useful when your project uses a `.env` file with syntax incompatible with python-dotenv
|
||||
|
|
@ -399,7 +397,6 @@ Global FastMCP settings can be configured via environment variables (prefixed wi
|
|||
# Configure global FastMCP behavior
|
||||
export FASTMCP_LOG_LEVEL=DEBUG
|
||||
export FASTMCP_MASK_ERROR_DETAILS=True
|
||||
export FASTMCP_RESOURCE_PREFIX_FORMAT=protocol
|
||||
export FASTMCP_STRICT_INPUT_VALIDATION=False
|
||||
export FASTMCP_INCLUDE_FASTMCP_META=False
|
||||
```
|
||||
|
|
|
|||
|
|
@ -34,15 +34,8 @@ REINFORCEMENT_FACTOR = 1.1
|
|||
DEFAULT_LLM_MODEL = "openai:gpt-4o"
|
||||
DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small"
|
||||
|
||||
mcp = FastMCP(
|
||||
"memory",
|
||||
dependencies=[
|
||||
"pydantic-ai-slim[openai]",
|
||||
"asyncpg",
|
||||
"numpy",
|
||||
"pgvector",
|
||||
],
|
||||
)
|
||||
# Dependencies are configured in memory.fastmcp.json
|
||||
mcp = FastMCP("memory")
|
||||
|
||||
DB_DSN = "postgresql://postgres:postgres@localhost:54320/memory_db"
|
||||
# reset memory by deleting the profile directory
|
||||
|
|
|
|||
|
|
@ -1,3 +1,7 @@
|
|||
# /// script
|
||||
# dependencies = ["pyautogui", "Pillow", "fastmcp"]
|
||||
# ///
|
||||
|
||||
"""
|
||||
FastMCP Screenshot Example
|
||||
|
||||
|
|
@ -10,7 +14,8 @@ from fastmcp import FastMCP
|
|||
from fastmcp.utilities.types import Image
|
||||
|
||||
# Create server
|
||||
mcp = FastMCP("Screenshot Demo", dependencies=["pyautogui", "Pillow"])
|
||||
# Dependencies are configured in screenshot.fastmcp.json
|
||||
mcp = FastMCP("Screenshot Demo")
|
||||
|
||||
|
||||
@mcp.tool
|
||||
|
|
|
|||
|
|
@ -1,3 +1,10 @@
|
|||
# /// script
|
||||
# dependencies = [
|
||||
# "smart_home@git+https://github.com/jlowin/fastmcp.git#subdirectory=examples/smart_home",
|
||||
# "fastmcp",
|
||||
# ]
|
||||
# ///
|
||||
|
||||
from typing import Annotated, Any, Literal, TypedDict
|
||||
|
||||
from phue2.exceptions import PhueException
|
||||
|
|
@ -35,12 +42,8 @@ class HueAttributes(TypedDict, total=False):
|
|||
transitiontime: NotRequired[Annotated[int, Field(description="deciseconds")]]
|
||||
|
||||
|
||||
lights_mcp = FastMCP(
|
||||
"Hue Lights Service (phue2)",
|
||||
dependencies=[
|
||||
"smart_home@git+https://github.com/jlowin/fastmcp.git#subdirectory=examples/smart_home",
|
||||
],
|
||||
)
|
||||
# Dependencies are configured in lights.fastmcp.json
|
||||
lights_mcp = FastMCP("Hue Lights Service (phue2)")
|
||||
|
||||
|
||||
@lights_mcp.tool
|
||||
|
|
|
|||
|
|
@ -27,26 +27,6 @@ if settings.deprecation_warnings:
|
|||
warnings.simplefilter("default", DeprecationWarning)
|
||||
|
||||
|
||||
def __getattr__(name: str):
|
||||
"""
|
||||
Used to deprecate the module-level Image class; can be removed once it is no longer imported to root.
|
||||
"""
|
||||
if name == "Image":
|
||||
# Deprecated in 2.8.1
|
||||
if settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"The top-level `fastmcp.Image` import is deprecated "
|
||||
"and will be removed in a future version. "
|
||||
"Please use `fastmcp.utilities.types.Image` instead.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
from fastmcp.utilities.types import Image
|
||||
|
||||
return Image
|
||||
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
||||
|
||||
|
||||
__all__ = [
|
||||
"Client",
|
||||
"Context",
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ from rich.table import Table
|
|||
import fastmcp
|
||||
from fastmcp.cli import run as run_module
|
||||
from fastmcp.cli.install import install_app
|
||||
from fastmcp.server.server import FastMCP
|
||||
from fastmcp.utilities.cli import is_already_in_uv_subprocess, load_and_merge_config
|
||||
from fastmcp.utilities.inspect import (
|
||||
InspectFormat,
|
||||
|
|
@ -28,7 +27,6 @@ from fastmcp.utilities.inspect import (
|
|||
)
|
||||
from fastmcp.utilities.logging import get_logger
|
||||
from fastmcp.utilities.mcp_server_config import MCPServerConfig
|
||||
from fastmcp.utilities.mcp_server_config.v1.environments.uv import UVEnvironment
|
||||
|
||||
logger = get_logger("cli")
|
||||
console = Console()
|
||||
|
|
@ -224,29 +222,11 @@ async def dev(
|
|||
)
|
||||
|
||||
try:
|
||||
# Load server to check for deprecated dependencies
|
||||
if not config:
|
||||
logger.error("No configuration available")
|
||||
sys.exit(1)
|
||||
assert config is not None # For type checker
|
||||
server: FastMCP = await config.source.load_server()
|
||||
if server.dependencies:
|
||||
import warnings
|
||||
|
||||
warnings.warn(
|
||||
f"Server '{server.name}' uses deprecated 'dependencies' parameter (deprecated in FastMCP 2.11.4). "
|
||||
"Please migrate to fastmcp.json configuration file. "
|
||||
"See https://gofastmcp.com/docs/deployment/server-configuration for details.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
# Merge server dependencies with environment dependencies
|
||||
env_deps = config.environment.dependencies or []
|
||||
all_deps = list(set(env_deps + server.dependencies))
|
||||
if not config.environment:
|
||||
config.environment = UVEnvironment(dependencies=all_deps)
|
||||
else:
|
||||
config.environment.dependencies = all_deps
|
||||
await config.source.load_server()
|
||||
|
||||
env_vars = {}
|
||||
if ui_port:
|
||||
|
|
|
|||
|
|
@ -105,21 +105,6 @@ async def process_common_args(
|
|||
)
|
||||
name = file.stem
|
||||
|
||||
# Get server dependencies if available
|
||||
# TODO: Remove dependencies handling (deprecated in v2.11.4)
|
||||
server_dependencies = getattr(server, "dependencies", []) if server else []
|
||||
if server_dependencies:
|
||||
import warnings
|
||||
|
||||
warnings.warn(
|
||||
"Server uses deprecated 'dependencies' parameter (deprecated in FastMCP 2.11.4). "
|
||||
"Please migrate to fastmcp.json configuration file. "
|
||||
"See https://gofastmcp.com/docs/deployment/server-configuration for details.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
with_packages = list(set(with_packages + server_dependencies))
|
||||
|
||||
# Process environment variables if provided
|
||||
env_dict: dict[str, str] | None = None
|
||||
if env_file or env_vars:
|
||||
|
|
|
|||
|
|
@ -105,16 +105,8 @@ class ComponentService:
|
|||
# 2. Check mounted servers using the filtered protocol path.
|
||||
for mounted in reversed(self._server._mounted_servers):
|
||||
if mounted.prefix:
|
||||
if has_resource_prefix(
|
||||
key,
|
||||
mounted.prefix,
|
||||
mounted.resource_prefix_format,
|
||||
):
|
||||
key = remove_resource_prefix(
|
||||
key,
|
||||
mounted.prefix,
|
||||
mounted.resource_prefix_format,
|
||||
)
|
||||
if has_resource_prefix(key, mounted.prefix):
|
||||
key = remove_resource_prefix(key, mounted.prefix)
|
||||
mounted_service = ComponentService(mounted.server)
|
||||
mounted_resource: (
|
||||
Resource | ResourceTemplate
|
||||
|
|
@ -148,16 +140,8 @@ class ComponentService:
|
|||
# 2. Check mounted servers using the filtered protocol path.
|
||||
for mounted in reversed(self._server._mounted_servers):
|
||||
if mounted.prefix:
|
||||
if has_resource_prefix(
|
||||
key,
|
||||
mounted.prefix,
|
||||
mounted.resource_prefix_format,
|
||||
):
|
||||
key = remove_resource_prefix(
|
||||
key,
|
||||
mounted.prefix,
|
||||
mounted.resource_prefix_format,
|
||||
)
|
||||
if has_resource_prefix(key, mounted.prefix):
|
||||
key = remove_resource_prefix(key, mounted.prefix)
|
||||
mounted_service = ComponentService(mounted.server)
|
||||
mounted_resource: (
|
||||
Resource | ResourceTemplate
|
||||
|
|
|
|||
|
|
@ -23,12 +23,3 @@ __all__ = [
|
|||
"StaticTokenVerifier",
|
||||
"TokenVerifier",
|
||||
]
|
||||
|
||||
|
||||
def __getattr__(name: str):
|
||||
# Defer import because it raises a deprecation warning
|
||||
if name == "BearerAuthProvider":
|
||||
from .providers.bearer import BearerAuthProvider
|
||||
|
||||
return BearerAuthProvider
|
||||
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
"""Backwards compatibility shim for BearerAuthProvider.
|
||||
|
||||
The BearerAuthProvider class has been moved to fastmcp.server.auth.providers.jwt.JWTVerifier
|
||||
for better organization. This module provides a backwards-compatible import.
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
import fastmcp
|
||||
from fastmcp.server.auth.providers.jwt import JWKData, JWKSData, RSAKeyPair
|
||||
from fastmcp.server.auth.providers.jwt import JWTVerifier as BearerAuthProvider
|
||||
|
||||
# Re-export for backwards compatibility
|
||||
__all__ = ["BearerAuthProvider", "JWKData", "JWKSData", "RSAKeyPair"]
|
||||
|
||||
# Deprecated in 2.11
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"The `fastmcp.server.auth.providers.bearer` module is deprecated "
|
||||
"and will be removed in a future version. "
|
||||
"Please use `fastmcp.server.auth.providers.jwt.JWTVerifier` "
|
||||
"instead of this module's BearerAuthProvider.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
|
@ -3,7 +3,6 @@ from __future__ import annotations
|
|||
import copy
|
||||
import inspect
|
||||
import logging
|
||||
import warnings
|
||||
import weakref
|
||||
from collections.abc import Generator, Mapping, Sequence
|
||||
from contextlib import contextmanager
|
||||
|
|
@ -39,8 +38,6 @@ from pydantic.networks import AnyUrl
|
|||
from starlette.requests import Request
|
||||
from typing_extensions import TypeVar
|
||||
|
||||
import fastmcp.server.dependencies
|
||||
from fastmcp import settings
|
||||
from fastmcp.server.elicitation import (
|
||||
AcceptedElicitation,
|
||||
CancelledElicitation,
|
||||
|
|
@ -680,21 +677,6 @@ class Context:
|
|||
# This should never happen, but handle it just in case
|
||||
raise ValueError(f"Unexpected elicitation action: {result.action}")
|
||||
|
||||
def get_http_request(self) -> Request:
|
||||
"""Get the active starlette request."""
|
||||
|
||||
# Deprecated in 2.2.11
|
||||
if settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"Context.get_http_request() is deprecated and will be removed in a future version. "
|
||||
"Use get_http_request() from fastmcp.server.dependencies instead. "
|
||||
"See https://gofastmcp.com/servers/context#http-requests for more details.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
return fastmcp.server.dependencies.get_http_request()
|
||||
|
||||
def set_state(self, key: str, value: Any) -> None:
|
||||
"""Set a value in the context state."""
|
||||
self._state[key] = value
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import inspect
|
||||
import warnings
|
||||
from collections.abc import Awaitable, Callable
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING, Any, cast
|
||||
|
|
@ -20,7 +19,6 @@ from mcp.types import (
|
|||
)
|
||||
from pydantic.networks import AnyUrl
|
||||
|
||||
import fastmcp
|
||||
from fastmcp.client.client import Client, FastMCP1Server
|
||||
from fastmcp.client.elicitation import ElicitResult
|
||||
from fastmcp.client.logging import LogMessage
|
||||
|
|
@ -471,9 +469,8 @@ class FastMCPProxy(FastMCP):
|
|||
|
||||
def __init__(
|
||||
self,
|
||||
client: Client | None = None,
|
||||
*,
|
||||
client_factory: ClientFactoryT | None = None,
|
||||
client_factory: ClientFactoryT,
|
||||
**kwargs,
|
||||
):
|
||||
"""
|
||||
|
|
@ -483,9 +480,6 @@ class FastMCPProxy(FastMCP):
|
|||
Use FastMCP.as_proxy() for convenience with automatic session strategy.
|
||||
|
||||
Args:
|
||||
client: [DEPRECATED] A Client instance. Use client_factory instead for explicit
|
||||
session management. When provided, a client_factory will be automatically
|
||||
created that provides session isolation for backwards compatibility.
|
||||
client_factory: A callable that returns a Client instance when called.
|
||||
This gives you full control over session creation and reuse.
|
||||
Can be either a synchronous or asynchronous function.
|
||||
|
|
@ -494,29 +488,7 @@ class FastMCPProxy(FastMCP):
|
|||
|
||||
super().__init__(**kwargs)
|
||||
|
||||
# Handle client and client_factory parameters
|
||||
if client is not None and client_factory is not None:
|
||||
raise ValueError("Cannot specify both 'client' and 'client_factory'")
|
||||
|
||||
if client is not None:
|
||||
# Deprecated in 2.10.3
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"Passing 'client' to FastMCPProxy is deprecated. Use 'client_factory' instead for explicit session management. "
|
||||
"For automatic session strategy, use FastMCP.as_proxy().",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
# Create a factory that provides session isolation for backwards compatibility
|
||||
def deprecated_client_factory():
|
||||
return client.new()
|
||||
|
||||
self.client_factory = deprecated_client_factory
|
||||
elif client_factory is not None:
|
||||
self.client_factory = client_factory
|
||||
else:
|
||||
raise ValueError("Must specify 'client_factory'")
|
||||
|
||||
# Replace the default managers with our specialized proxy managers.
|
||||
self._tool_manager = ProxyToolManager(
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import inspect
|
||||
import json
|
||||
import re
|
||||
import secrets
|
||||
import warnings
|
||||
|
|
@ -158,8 +157,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
auth: AuthProvider | NotSetT | None = NotSet,
|
||||
middleware: Sequence[Middleware] | None = None,
|
||||
lifespan: LifespanCallable | None = None,
|
||||
dependencies: list[str] | None = None,
|
||||
resource_prefix_format: Literal["protocol", "path"] | None = None,
|
||||
mask_error_details: bool | None = None,
|
||||
tools: Sequence[Tool | Callable[..., Any]] | None = None,
|
||||
tool_transformations: Mapping[str, ToolTransformConfig] | None = None,
|
||||
|
|
@ -188,10 +185,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
sampling_handler: ServerSamplingHandler[LifespanResultT] | None = None,
|
||||
sampling_handler_behavior: Literal["always", "fallback"] | None = None,
|
||||
):
|
||||
self.resource_prefix_format: Literal["protocol", "path"] = (
|
||||
resource_prefix_format or fastmcp.settings.resource_prefix_format
|
||||
)
|
||||
|
||||
self._additional_http_routes: list[BaseRoute] = []
|
||||
self._mounted_servers: list[MountedServer] = []
|
||||
self._tool_manager: ToolManager = ToolManager(
|
||||
|
|
@ -259,24 +252,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
# Set up MCP protocol handlers
|
||||
self._setup_handlers()
|
||||
|
||||
# Handle dependencies with deprecation warning
|
||||
# TODO: Remove dependencies parameter (deprecated in v2.11.4)
|
||||
if dependencies is not None:
|
||||
import warnings
|
||||
|
||||
warnings.warn(
|
||||
"The 'dependencies' parameter is deprecated as of FastMCP 2.11.4 and will be removed in a future version. "
|
||||
"Please specify dependencies in a fastmcp.json configuration file instead:\n"
|
||||
'{\n "entrypoint": "your_server.py",\n "environment": {\n "dependencies": '
|
||||
f"{json.dumps(dependencies)}\n }}\n}}\n"
|
||||
"See https://gofastmcp.com/docs/deployment/server-configuration for more information.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
self.dependencies: list[str] = (
|
||||
dependencies or fastmcp.settings.server_dependencies
|
||||
) # TODO: Remove (deprecated in v2.11.4)
|
||||
|
||||
self.sampling_handler: ServerSamplingHandler[LifespanResultT] | None = (
|
||||
sampling_handler
|
||||
)
|
||||
|
|
@ -516,9 +491,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
child_resources = await mounted.server.get_resources()
|
||||
for key, resource in child_resources.items():
|
||||
new_key = (
|
||||
add_resource_prefix(
|
||||
key, mounted.prefix, mounted.resource_prefix_format
|
||||
)
|
||||
add_resource_prefix(key, mounted.prefix)
|
||||
if mounted.prefix
|
||||
else key
|
||||
)
|
||||
|
|
@ -555,9 +528,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
child_templates = await mounted.server.get_resource_templates()
|
||||
for key, template in child_templates.items():
|
||||
new_key = (
|
||||
add_resource_prefix(
|
||||
key, mounted.prefix, mounted.resource_prefix_format
|
||||
)
|
||||
add_resource_prefix(key, mounted.prefix)
|
||||
if mounted.prefix
|
||||
else key
|
||||
)
|
||||
|
|
@ -835,11 +806,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
|
||||
key = resource.key
|
||||
if mounted.prefix:
|
||||
key = add_resource_prefix(
|
||||
resource.key,
|
||||
mounted.prefix,
|
||||
mounted.resource_prefix_format,
|
||||
)
|
||||
key = add_resource_prefix(resource.key, mounted.prefix)
|
||||
resource = resource.model_copy(
|
||||
key=key,
|
||||
update={"name": f"{mounted.prefix}_{resource.name}"},
|
||||
|
|
@ -931,11 +898,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
|
||||
key = template.key
|
||||
if mounted.prefix:
|
||||
key = add_resource_prefix(
|
||||
template.key,
|
||||
mounted.prefix,
|
||||
mounted.resource_prefix_format,
|
||||
)
|
||||
key = add_resource_prefix(template.key, mounted.prefix)
|
||||
template = template.model_copy(
|
||||
key=key,
|
||||
update={"name": f"{mounted.prefix}_{template.name}"},
|
||||
|
|
@ -1195,13 +1158,9 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
for mounted in reversed(self._mounted_servers):
|
||||
key = uri_str
|
||||
if mounted.prefix:
|
||||
if not has_resource_prefix(
|
||||
key, mounted.prefix, mounted.resource_prefix_format
|
||||
):
|
||||
if not has_resource_prefix(key, mounted.prefix):
|
||||
continue
|
||||
key = remove_resource_prefix(
|
||||
key, mounted.prefix, mounted.resource_prefix_format
|
||||
)
|
||||
key = remove_resource_prefix(key, mounted.prefix)
|
||||
|
||||
try:
|
||||
# First, get the resource to check if parent's filter allows it
|
||||
|
|
@ -1580,44 +1539,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
|
||||
return template
|
||||
|
||||
def add_resource_fn(
|
||||
self,
|
||||
fn: AnyFunction,
|
||||
uri: str,
|
||||
name: str | None = None,
|
||||
description: str | None = None,
|
||||
mime_type: str | None = None,
|
||||
tags: set[str] | None = None,
|
||||
) -> None:
|
||||
"""Add a resource or template to the server from a function.
|
||||
|
||||
If the URI contains parameters (e.g. "resource://{param}") or the function
|
||||
has parameters, it will be registered as a template resource.
|
||||
|
||||
Args:
|
||||
fn: The function to register as a resource
|
||||
uri: The URI for the resource
|
||||
name: Optional name for the resource
|
||||
description: Optional description of the resource
|
||||
mime_type: Optional MIME type for the resource
|
||||
tags: Optional set of tags for categorizing the resource
|
||||
"""
|
||||
# deprecated since 2.7.0
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"The add_resource_fn method is deprecated. Use the resource decorator instead.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
self._resource_manager.add_resource_or_template_from_fn(
|
||||
fn=fn,
|
||||
uri=uri,
|
||||
name=name,
|
||||
description=description,
|
||||
mime_type=mime_type,
|
||||
tags=tags,
|
||||
)
|
||||
|
||||
def resource(
|
||||
self,
|
||||
uri: str,
|
||||
|
|
@ -2061,86 +1982,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
|
||||
await server.serve()
|
||||
|
||||
async def run_sse_async(
|
||||
self,
|
||||
host: str | None = None,
|
||||
port: int | None = None,
|
||||
log_level: str | None = None,
|
||||
path: str | None = None,
|
||||
uvicorn_config: dict[str, Any] | None = None,
|
||||
) -> None:
|
||||
"""Run the server using SSE transport."""
|
||||
|
||||
# Deprecated since 2.3.2
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"The run_sse_async method is deprecated (as of 2.3.2). Use run_http_async for a "
|
||||
"modern (non-SSE) alternative, or create an SSE app with "
|
||||
"`fastmcp.server.http.create_sse_app` and run it directly.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
await self.run_http_async(
|
||||
transport="sse",
|
||||
host=host,
|
||||
port=port,
|
||||
log_level=log_level,
|
||||
path=path,
|
||||
uvicorn_config=uvicorn_config,
|
||||
)
|
||||
|
||||
def sse_app(
|
||||
self,
|
||||
path: str | None = None,
|
||||
message_path: str | None = None,
|
||||
middleware: list[ASGIMiddleware] | None = None,
|
||||
) -> StarletteWithLifespan:
|
||||
"""
|
||||
Create a Starlette app for the SSE server.
|
||||
|
||||
Args:
|
||||
path: The path to the SSE endpoint
|
||||
message_path: The path to the message endpoint
|
||||
middleware: A list of middleware to apply to the app
|
||||
"""
|
||||
# Deprecated since 2.3.2
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"The sse_app method is deprecated (as of 2.3.2). Use http_app as a modern (non-SSE) "
|
||||
"alternative, or call `fastmcp.server.http.create_sse_app` directly.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
return create_sse_app(
|
||||
server=self,
|
||||
message_path=message_path or self._deprecated_settings.message_path,
|
||||
sse_path=path or self._deprecated_settings.sse_path,
|
||||
auth=self.auth,
|
||||
debug=self._deprecated_settings.debug,
|
||||
middleware=middleware,
|
||||
)
|
||||
|
||||
def streamable_http_app(
|
||||
self,
|
||||
path: str | None = None,
|
||||
middleware: list[ASGIMiddleware] | None = None,
|
||||
) -> StarletteWithLifespan:
|
||||
"""
|
||||
Create a Starlette app for the StreamableHTTP server.
|
||||
|
||||
Args:
|
||||
path: The path to the StreamableHTTP endpoint
|
||||
middleware: A list of middleware to apply to the app
|
||||
"""
|
||||
# Deprecated since 2.3.2
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"The streamable_http_app method is deprecated (as of 2.3.2). Use http_app() instead.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
return self.http_app(path=path, middleware=middleware)
|
||||
|
||||
def http_app(
|
||||
self,
|
||||
path: str | None = None,
|
||||
|
|
@ -2190,31 +2031,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
middleware=middleware,
|
||||
)
|
||||
|
||||
async def run_streamable_http_async(
|
||||
self,
|
||||
host: str | None = None,
|
||||
port: int | None = None,
|
||||
log_level: str | None = None,
|
||||
path: str | None = None,
|
||||
uvicorn_config: dict[str, Any] | None = None,
|
||||
) -> None:
|
||||
# Deprecated since 2.3.2
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"The run_streamable_http_async method is deprecated (as of 2.3.2). "
|
||||
"Use run_http_async instead.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
await self.run_http_async(
|
||||
transport="http",
|
||||
host=host,
|
||||
port=port,
|
||||
log_level=log_level,
|
||||
path=path,
|
||||
uvicorn_config=uvicorn_config,
|
||||
)
|
||||
|
||||
def mount(
|
||||
self,
|
||||
server: FastMCP[LifespanResultT],
|
||||
|
|
@ -2330,7 +2146,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
mounted_server = MountedServer(
|
||||
prefix=prefix,
|
||||
server=server,
|
||||
resource_prefix_format=self.resource_prefix_format,
|
||||
)
|
||||
self._mounted_servers.append(mounted_server)
|
||||
|
||||
|
|
@ -2431,9 +2246,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
# Import resources and templates from the server
|
||||
for key, resource in (await server.get_resources()).items():
|
||||
if prefix:
|
||||
resource_key = add_resource_prefix(
|
||||
key, prefix, self.resource_prefix_format
|
||||
)
|
||||
resource_key = add_resource_prefix(key, prefix)
|
||||
resource = resource.model_copy(
|
||||
update={"name": f"{prefix}_{resource.name}"}, key=resource_key
|
||||
)
|
||||
|
|
@ -2441,9 +2254,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
|
||||
for key, template in (await server.get_resource_templates()).items():
|
||||
if prefix:
|
||||
template_key = add_resource_prefix(
|
||||
key, prefix, self.resource_prefix_format
|
||||
)
|
||||
template_key = add_resource_prefix(key, prefix)
|
||||
template = template.model_copy(
|
||||
update={"name": f"{prefix}_{template.name}"}, key=template_key
|
||||
)
|
||||
|
|
@ -2643,23 +2454,6 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
|
||||
return FastMCPProxy(client_factory=client_factory, **settings)
|
||||
|
||||
@classmethod
|
||||
def from_client(
|
||||
cls, client: Client[ClientTransportT], **settings: Any
|
||||
) -> FastMCPProxy:
|
||||
"""
|
||||
Create a FastMCP proxy server from a FastMCP client.
|
||||
"""
|
||||
# Deprecated since 2.3.5
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"FastMCP.from_client() is deprecated; use FastMCP.as_proxy() instead.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
return cls.as_proxy(client, **settings)
|
||||
|
||||
def _should_enable_component(
|
||||
self,
|
||||
component: FastMCPComponent,
|
||||
|
|
@ -2706,13 +2500,10 @@ class FastMCP(Generic[LifespanResultT]):
|
|||
class MountedServer:
|
||||
prefix: str | None
|
||||
server: FastMCP[Any]
|
||||
resource_prefix_format: Literal["protocol", "path"] | None = None
|
||||
|
||||
|
||||
def add_resource_prefix(
|
||||
uri: str, prefix: str, prefix_format: Literal["protocol", "path"] | None = None
|
||||
) -> str:
|
||||
"""Add a prefix to a resource URI.
|
||||
def add_resource_prefix(uri: str, prefix: str) -> str:
|
||||
"""Add a prefix to a resource URI using path formatting (resource://prefix/path).
|
||||
|
||||
Args:
|
||||
uri: The original resource URI
|
||||
|
|
@ -2722,16 +2513,10 @@ def add_resource_prefix(
|
|||
The resource URI with the prefix added
|
||||
|
||||
Examples:
|
||||
With new style:
|
||||
```python
|
||||
add_resource_prefix("resource://path/to/resource", "prefix")
|
||||
"resource://prefix/path/to/resource"
|
||||
```
|
||||
With legacy style:
|
||||
```python
|
||||
add_resource_prefix("resource://path/to/resource", "prefix")
|
||||
"prefix+resource://path/to/resource"
|
||||
```
|
||||
With absolute path:
|
||||
```python
|
||||
add_resource_prefix("resource:///absolute/path", "prefix")
|
||||
|
|
@ -2744,54 +2529,32 @@ def add_resource_prefix(
|
|||
if not prefix:
|
||||
return uri
|
||||
|
||||
# Get the server settings to check for legacy format preference
|
||||
|
||||
if prefix_format is None:
|
||||
prefix_format = fastmcp.settings.resource_prefix_format
|
||||
|
||||
if prefix_format == "protocol":
|
||||
# Legacy style: prefix+protocol://path
|
||||
return f"{prefix}+{uri}"
|
||||
elif prefix_format == "path":
|
||||
# New style: protocol://prefix/path
|
||||
# Split the URI into protocol and path
|
||||
match = URI_PATTERN.match(uri)
|
||||
if not match:
|
||||
raise ValueError(
|
||||
f"Invalid URI format: {uri}. Expected protocol://path format."
|
||||
)
|
||||
raise ValueError(f"Invalid URI format: {uri}. Expected protocol://path format.")
|
||||
|
||||
protocol, path = match.groups()
|
||||
|
||||
# Add the prefix to the path
|
||||
return f"{protocol}{prefix}/{path}"
|
||||
else:
|
||||
raise ValueError(f"Invalid prefix format: {prefix_format}")
|
||||
|
||||
|
||||
def remove_resource_prefix(
|
||||
uri: str, prefix: str, prefix_format: Literal["protocol", "path"] | None = None
|
||||
) -> str:
|
||||
def remove_resource_prefix(uri: str, prefix: str) -> str:
|
||||
"""Remove a prefix from a resource URI.
|
||||
|
||||
Args:
|
||||
uri: The resource URI with a prefix
|
||||
prefix: The prefix to remove
|
||||
prefix_format: The format of the prefix to remove
|
||||
|
||||
Returns:
|
||||
The resource URI with the prefix removed
|
||||
|
||||
Examples:
|
||||
With new style:
|
||||
```python
|
||||
remove_resource_prefix("resource://prefix/path/to/resource", "prefix")
|
||||
"resource://path/to/resource"
|
||||
```
|
||||
With legacy style:
|
||||
```python
|
||||
remove_resource_prefix("prefix+resource://path/to/resource", "prefix")
|
||||
"resource://path/to/resource"
|
||||
```
|
||||
With absolute path:
|
||||
```python
|
||||
remove_resource_prefix("resource://prefix//absolute/path", "prefix")
|
||||
|
|
@ -2804,23 +2567,10 @@ def remove_resource_prefix(
|
|||
if not prefix:
|
||||
return uri
|
||||
|
||||
if prefix_format is None:
|
||||
prefix_format = fastmcp.settings.resource_prefix_format
|
||||
|
||||
if prefix_format == "protocol":
|
||||
# Legacy style: prefix+protocol://path
|
||||
legacy_prefix = f"{prefix}+"
|
||||
if uri.startswith(legacy_prefix):
|
||||
return uri[len(legacy_prefix) :]
|
||||
return uri
|
||||
elif prefix_format == "path":
|
||||
# New style: protocol://prefix/path
|
||||
# Split the URI into protocol and path
|
||||
match = URI_PATTERN.match(uri)
|
||||
if not match:
|
||||
raise ValueError(
|
||||
f"Invalid URI format: {uri}. Expected protocol://path format."
|
||||
)
|
||||
raise ValueError(f"Invalid URI format: {uri}. Expected protocol://path format.")
|
||||
|
||||
protocol, path = match.groups()
|
||||
|
||||
|
|
@ -2832,13 +2582,9 @@ def remove_resource_prefix(
|
|||
|
||||
# Return the URI without the prefix
|
||||
return f"{protocol}{path_match.group(1)}"
|
||||
else:
|
||||
raise ValueError(f"Invalid prefix format: {prefix_format}")
|
||||
|
||||
|
||||
def has_resource_prefix(
|
||||
uri: str, prefix: str, prefix_format: Literal["protocol", "path"] | None = None
|
||||
) -> bool:
|
||||
def has_resource_prefix(uri: str, prefix: str) -> bool:
|
||||
"""Check if a resource URI has a specific prefix.
|
||||
|
||||
Args:
|
||||
|
|
@ -2849,16 +2595,10 @@ def has_resource_prefix(
|
|||
True if the URI has the specified prefix, False otherwise
|
||||
|
||||
Examples:
|
||||
With new style:
|
||||
```python
|
||||
has_resource_prefix("resource://prefix/path/to/resource", "prefix")
|
||||
True
|
||||
```
|
||||
With legacy style:
|
||||
```python
|
||||
has_resource_prefix("prefix+resource://path/to/resource", "prefix")
|
||||
True
|
||||
```
|
||||
With other path:
|
||||
```python
|
||||
has_resource_prefix("resource://other/path/to/resource", "prefix")
|
||||
|
|
@ -2871,28 +2611,13 @@ def has_resource_prefix(
|
|||
if not prefix:
|
||||
return False
|
||||
|
||||
# Get the server settings to check for legacy format preference
|
||||
|
||||
if prefix_format is None:
|
||||
prefix_format = fastmcp.settings.resource_prefix_format
|
||||
|
||||
if prefix_format == "protocol":
|
||||
# Legacy style: prefix+protocol://path
|
||||
legacy_prefix = f"{prefix}+"
|
||||
return uri.startswith(legacy_prefix)
|
||||
elif prefix_format == "path":
|
||||
# New style: protocol://prefix/path
|
||||
# Split the URI into protocol and path
|
||||
match = URI_PATTERN.match(uri)
|
||||
if not match:
|
||||
raise ValueError(
|
||||
f"Invalid URI format: {uri}. Expected protocol://path format."
|
||||
)
|
||||
raise ValueError(f"Invalid URI format: {uri}. Expected protocol://path format.")
|
||||
|
||||
_, path = match.groups()
|
||||
|
||||
# Check if the path starts with the prefix followed by a /
|
||||
prefix_pattern = f"^{re.escape(prefix)}/"
|
||||
return bool(re.match(prefix_pattern, path))
|
||||
else:
|
||||
raise ValueError(f"Invalid prefix format: {prefix_format}")
|
||||
|
|
|
|||
|
|
@ -8,11 +8,8 @@ from typing import TYPE_CHECKING, Annotated, Any, Literal
|
|||
|
||||
from platformdirs import user_data_dir
|
||||
from pydantic import Field, ImportString, field_validator
|
||||
from pydantic.fields import FieldInfo
|
||||
from pydantic_settings import (
|
||||
BaseSettings,
|
||||
EnvSettingsSource,
|
||||
PydanticBaseSettingsSource,
|
||||
SettingsConfigDict,
|
||||
)
|
||||
from typing_extensions import Self
|
||||
|
|
@ -33,37 +30,6 @@ if TYPE_CHECKING:
|
|||
from fastmcp.server.auth.auth import AuthProvider
|
||||
|
||||
|
||||
class ExtendedEnvSettingsSource(EnvSettingsSource):
|
||||
"""
|
||||
A special EnvSettingsSource that allows for multiple env var prefixes to be used.
|
||||
|
||||
Raises a deprecation warning if the old `FASTMCP_SERVER_` prefix is used.
|
||||
"""
|
||||
|
||||
def get_field_value(
|
||||
self, field: FieldInfo, field_name: str
|
||||
) -> tuple[Any, str, bool]:
|
||||
if prefixes := self.config.get("env_prefixes"):
|
||||
for prefix in prefixes:
|
||||
self.env_prefix = prefix
|
||||
env_val, field_key, value_is_complex = super().get_field_value(
|
||||
field, field_name
|
||||
)
|
||||
if env_val is not None:
|
||||
if prefix == "FASTMCP_SERVER_":
|
||||
# Deprecated in 2.8.0
|
||||
logger.warning(
|
||||
"Using `FASTMCP_SERVER_` environment variables is deprecated. Use `FASTMCP_` instead.",
|
||||
)
|
||||
return env_val, field_key, value_is_complex
|
||||
|
||||
return super().get_field_value(field, field_name)
|
||||
|
||||
|
||||
class ExtendedSettingsConfigDict(SettingsConfigDict, total=False):
|
||||
env_prefixes: list[str] | None
|
||||
|
||||
|
||||
class ExperimentalSettings(BaseSettings):
|
||||
model_config = SettingsConfigDict(
|
||||
env_prefix="FASTMCP_EXPERIMENTAL_",
|
||||
|
|
@ -86,8 +52,8 @@ class ExperimentalSettings(BaseSettings):
|
|||
class Settings(BaseSettings):
|
||||
"""FastMCP settings."""
|
||||
|
||||
model_config = ExtendedSettingsConfigDict(
|
||||
env_prefixes=["FASTMCP_", "FASTMCP_SERVER_"],
|
||||
model_config = SettingsConfigDict(
|
||||
env_prefix="FASTMCP_",
|
||||
env_file=ENV_FILE,
|
||||
extra="ignore",
|
||||
env_nested_delimiter="__",
|
||||
|
|
@ -121,24 +87,6 @@ class Settings(BaseSettings):
|
|||
settings = getattr(settings, parent_attr)
|
||||
setattr(settings, attr, value)
|
||||
|
||||
@classmethod
|
||||
def settings_customise_sources(
|
||||
cls,
|
||||
settings_cls: type[BaseSettings],
|
||||
init_settings: PydanticBaseSettingsSource,
|
||||
env_settings: PydanticBaseSettingsSource,
|
||||
dotenv_settings: PydanticBaseSettingsSource,
|
||||
file_secret_settings: PydanticBaseSettingsSource,
|
||||
) -> tuple[PydanticBaseSettingsSource, ...]:
|
||||
# can remove this classmethod after deprecated FASTMCP_SERVER_ prefix is
|
||||
# removed
|
||||
return (
|
||||
init_settings,
|
||||
ExtendedEnvSettingsSource(settings_cls),
|
||||
dotenv_settings,
|
||||
file_secret_settings,
|
||||
)
|
||||
|
||||
@property
|
||||
def settings(self) -> Self:
|
||||
"""
|
||||
|
|
@ -207,19 +155,6 @@ class Settings(BaseSettings):
|
|||
),
|
||||
] = True
|
||||
|
||||
resource_prefix_format: Annotated[
|
||||
Literal["protocol", "path"],
|
||||
Field(
|
||||
description=inspect.cleandoc(
|
||||
"""
|
||||
When perfixing a resource URI, either use path formatting (resource://prefix/path)
|
||||
or protocol formatting (prefix+resource://path). Protocol formatting was the default in FastMCP < 2.4;
|
||||
path formatting is current default.
|
||||
"""
|
||||
),
|
||||
),
|
||||
] = "path"
|
||||
|
||||
client_init_timeout: Annotated[
|
||||
float | None,
|
||||
Field(
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ from typing import (
|
|||
Annotated,
|
||||
Any,
|
||||
Generic,
|
||||
Literal,
|
||||
TypeAlias,
|
||||
get_type_hints,
|
||||
)
|
||||
|
|
@ -184,7 +183,7 @@ class Tool(FastMCPComponent):
|
|||
tags: set[str] | None = None,
|
||||
annotations: ToolAnnotations | None = None,
|
||||
exclude_args: list[str] | None = None,
|
||||
output_schema: dict[str, Any] | Literal[False] | NotSetT | None = NotSet,
|
||||
output_schema: dict[str, Any] | NotSetT | None = NotSet,
|
||||
serializer: ToolResultSerializerType | None = None,
|
||||
meta: dict[str, Any] | None = None,
|
||||
enabled: bool | None = None,
|
||||
|
|
@ -227,7 +226,7 @@ class Tool(FastMCPComponent):
|
|||
description: str | NotSetT | None = NotSet,
|
||||
tags: set[str] | None = None,
|
||||
annotations: ToolAnnotations | NotSetT | None = NotSet,
|
||||
output_schema: dict[str, Any] | Literal[False] | NotSetT | None = NotSet,
|
||||
output_schema: dict[str, Any] | NotSetT | None = NotSet,
|
||||
serializer: ToolResultSerializerType | None = None,
|
||||
meta: dict[str, Any] | NotSetT | None = NotSet,
|
||||
transform_args: dict[str, ArgTransform] | None = None,
|
||||
|
|
@ -266,7 +265,7 @@ class FunctionTool(Tool):
|
|||
tags: set[str] | None = None,
|
||||
annotations: ToolAnnotations | None = None,
|
||||
exclude_args: list[str] | None = None,
|
||||
output_schema: dict[str, Any] | Literal[False] | NotSetT | None = NotSet,
|
||||
output_schema: dict[str, Any] | NotSetT | None = NotSet,
|
||||
serializer: ToolResultSerializerType | None = None,
|
||||
meta: dict[str, Any] | None = None,
|
||||
enabled: bool | None = None,
|
||||
|
|
@ -290,17 +289,8 @@ class FunctionTool(Tool):
|
|||
|
||||
if isinstance(output_schema, NotSetT):
|
||||
final_output_schema = parsed_fn.output_schema
|
||||
elif output_schema is False:
|
||||
# Handle False as deprecated synonym for None (deprecated in 2.11.4)
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"Passing output_schema=False is deprecated. Use output_schema=None instead.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
final_output_schema = None
|
||||
else:
|
||||
# At this point output_schema is not NotSetT and not False, so it must be dict | None
|
||||
# At this point output_schema is not NotSetT, so it must be dict | None
|
||||
final_output_schema = output_schema
|
||||
# Note: explicit schemas (dict) are used as-is without auto-wrapping
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import inspect
|
||||
import warnings
|
||||
from collections.abc import Callable
|
||||
from contextvars import ContextVar
|
||||
from copy import deepcopy
|
||||
|
|
@ -14,7 +13,6 @@ from pydantic import ConfigDict
|
|||
from pydantic.fields import Field
|
||||
from pydantic.functional_validators import BeforeValidator
|
||||
|
||||
import fastmcp
|
||||
from fastmcp.tools.tool import ParsedFunction, Tool, ToolResult, _convert_to_content
|
||||
from fastmcp.utilities.components import _convert_set_default_none
|
||||
from fastmcp.utilities.json_schema import compress_schema
|
||||
|
|
@ -372,7 +370,7 @@ class TransformedTool(Tool):
|
|||
transform_fn: Callable[..., Any] | None = None,
|
||||
transform_args: dict[str, ArgTransform] | None = None,
|
||||
annotations: ToolAnnotations | NotSetT | None = NotSet,
|
||||
output_schema: dict[str, Any] | Literal[False] | NotSetT | None = NotSet,
|
||||
output_schema: dict[str, Any] | NotSetT | None = NotSet,
|
||||
serializer: Callable[[Any], str] | NotSetT | None = NotSet,
|
||||
meta: dict[str, Any] | NotSetT | None = NotSet,
|
||||
enabled: bool | None = None,
|
||||
|
|
@ -487,15 +485,6 @@ class TransformedTool(Tool):
|
|||
final_output_schema = tool.output_schema
|
||||
else:
|
||||
final_output_schema = tool.output_schema
|
||||
elif output_schema is False:
|
||||
# Handle False as deprecated synonym for None (deprecated in 2.11.4)
|
||||
if fastmcp.settings.deprecation_warnings:
|
||||
warnings.warn(
|
||||
"Passing output_schema=False is deprecated. Use output_schema=None instead.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
final_output_schema = None
|
||||
else:
|
||||
final_output_schema = cast(dict | None, output_schema)
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ from mcp import McpError
|
|||
from fastmcp.client import Client
|
||||
from fastmcp.client.transports import SSETransport
|
||||
from fastmcp.server.dependencies import get_http_request
|
||||
from fastmcp.server.http import create_sse_app
|
||||
from fastmcp.server.server import FastMCP
|
||||
from fastmcp.utilities.tests import run_server_async
|
||||
|
||||
|
|
@ -94,7 +95,6 @@ async def nested_sse_server():
|
|||
from starlette.applications import Starlette
|
||||
from starlette.routing import Mount
|
||||
|
||||
from fastmcp.server.http import create_sse_app
|
||||
from fastmcp.utilities.http import find_available_port
|
||||
|
||||
server = create_test_server()
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
import pytest
|
||||
|
||||
# reset deprecation warnings for this module
|
||||
pytestmark = pytest.mark.filterwarnings("default::DeprecationWarning")
|
||||
|
||||
|
||||
def test_bearer_auth_provider_deprecated():
|
||||
"""Test that BearerAuthProvider import shows deprecation warning."""
|
||||
with pytest.warns(
|
||||
DeprecationWarning,
|
||||
match="The `fastmcp.server.auth.providers.bearer` module is deprecated and will be removed in a future version. Please use `fastmcp.server.auth.providers.jwt.JWTVerifier` instead of this module's BearerAuthProvider.",
|
||||
):
|
||||
from fastmcp.server.auth import BearerAuthProvider # noqa: F401
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
"""Tests for deprecated dependencies parameter.
|
||||
|
||||
This entire file can be deleted when the dependencies parameter is removed (deprecated in v2.11.4).
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
import pytest
|
||||
|
||||
from fastmcp import FastMCP
|
||||
|
||||
|
||||
def test_dependencies_parameter_deprecated():
|
||||
"""Test that using the dependencies parameter raises a deprecation warning."""
|
||||
|
||||
with pytest.warns(DeprecationWarning, match="deprecated as of FastMCP 2.11.4"):
|
||||
server = FastMCP("Test Server", dependencies=["pandas", "numpy"])
|
||||
|
||||
# Should still work for backward compatibility
|
||||
assert server.dependencies == ["pandas", "numpy"]
|
||||
|
||||
|
||||
def test_no_warning_without_dependencies():
|
||||
"""Test that no warning is raised when dependencies are not used."""
|
||||
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("error") # Turn warnings into errors
|
||||
server = FastMCP("Test Server") # Should not raise
|
||||
|
||||
assert server.dependencies == [] # Should use default empty list
|
||||
|
|
@ -1,10 +1,9 @@
|
|||
import warnings
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
from starlette.applications import Starlette
|
||||
|
||||
from fastmcp import Client, FastMCP
|
||||
from fastmcp import FastMCP
|
||||
from fastmcp.utilities.tests import temporary_settings
|
||||
|
||||
# reset deprecation warnings for this module
|
||||
|
|
@ -33,61 +32,6 @@ class TestDeprecationWarningsSetting:
|
|||
mcp.settings
|
||||
|
||||
|
||||
def test_sse_app_deprecation_warning():
|
||||
"""Test that sse_app raises a deprecation warning."""
|
||||
server = FastMCP("TestServer")
|
||||
|
||||
with pytest.warns(DeprecationWarning, match="The sse_app method is deprecated"):
|
||||
app = server.sse_app()
|
||||
assert isinstance(app, Starlette)
|
||||
|
||||
|
||||
def test_streamable_http_app_deprecation_warning():
|
||||
"""Test that streamable_http_app raises a deprecation warning."""
|
||||
server = FastMCP("TestServer")
|
||||
|
||||
with pytest.warns(
|
||||
DeprecationWarning, match="The streamable_http_app method is deprecated"
|
||||
):
|
||||
app = server.streamable_http_app()
|
||||
assert isinstance(app, Starlette)
|
||||
|
||||
|
||||
async def test_run_sse_async_deprecation_warning():
|
||||
"""Test that run_sse_async raises a deprecation warning."""
|
||||
server = FastMCP("TestServer")
|
||||
|
||||
# Use patch to avoid actually running the server
|
||||
with patch.object(server, "run_http_async", new_callable=AsyncMock) as mock_run:
|
||||
with pytest.warns(
|
||||
DeprecationWarning, match="The run_sse_async method is deprecated"
|
||||
):
|
||||
await server.run_sse_async()
|
||||
|
||||
# Verify the mock was called with the right transport
|
||||
mock_run.assert_called_once()
|
||||
call_kwargs = mock_run.call_args.kwargs
|
||||
assert call_kwargs.get("transport") == "sse"
|
||||
|
||||
|
||||
async def test_run_streamable_http_async_deprecation_warning():
|
||||
"""Test that run_streamable_http_async raises a deprecation warning."""
|
||||
server = FastMCP("TestServer")
|
||||
|
||||
# Use patch to avoid actually running the server
|
||||
with patch.object(server, "run_http_async", new_callable=AsyncMock) as mock_run:
|
||||
with pytest.warns(
|
||||
DeprecationWarning,
|
||||
match="The run_streamable_http_async method is deprecated",
|
||||
):
|
||||
await server.run_streamable_http_async()
|
||||
|
||||
# Verify the mock was called with the right transport
|
||||
mock_run.assert_called_once()
|
||||
call_kwargs = mock_run.call_args.kwargs
|
||||
assert call_kwargs.get("transport") == "http"
|
||||
|
||||
|
||||
def test_http_app_with_sse_transport():
|
||||
"""Test that http_app with SSE transport works (no warning)."""
|
||||
server = FastMCP("TestServer")
|
||||
|
|
@ -102,10 +46,3 @@ def test_http_app_with_sse_transport():
|
|||
w for w in recorded_warnings if issubclass(w.category, DeprecationWarning)
|
||||
]
|
||||
assert len(deprecation_warnings) == 0
|
||||
|
||||
|
||||
def test_from_client_deprecation_warning():
|
||||
"""Test that FastMCP.from_client raises a deprecation warning."""
|
||||
server = FastMCP("TestServer")
|
||||
with pytest.warns(DeprecationWarning, match="from_client"):
|
||||
FastMCP.from_client(Client(server))
|
||||
|
|
|
|||
|
|
@ -1,139 +0,0 @@
|
|||
"""Test deprecated output_schema=False behavior (deprecated in 2.11.4)."""
|
||||
|
||||
import warnings
|
||||
|
||||
import pytest
|
||||
|
||||
from fastmcp import FastMCP
|
||||
from fastmcp.tools import Tool
|
||||
|
||||
|
||||
class TestDeprecatedOutputSchemaFalse:
|
||||
"""Test that output_schema=False is deprecated but still works."""
|
||||
|
||||
async def test_tool_decorator_output_schema_false_deprecated(self):
|
||||
"""Test that @mcp.tool(output_schema=False) shows deprecation warning."""
|
||||
mcp = FastMCP()
|
||||
|
||||
with pytest.warns(
|
||||
DeprecationWarning, match="output_schema=False is deprecated"
|
||||
):
|
||||
|
||||
@mcp.tool(output_schema=False) # type: ignore[arg-type]
|
||||
def simple_tool() -> int:
|
||||
"""A simple tool."""
|
||||
return 42
|
||||
|
||||
# Verify the tool was created with None as output_schema
|
||||
tool = mcp._tool_manager._tools["simple_tool"]
|
||||
assert tool.output_schema is None
|
||||
|
||||
async def test_tool_from_function_output_schema_false_deprecated(self):
|
||||
"""Test that Tool.from_function(output_schema=False) shows deprecation warning."""
|
||||
|
||||
def my_function() -> str:
|
||||
"""A simple function."""
|
||||
return "hello"
|
||||
|
||||
with pytest.warns(
|
||||
DeprecationWarning, match="output_schema=False is deprecated"
|
||||
):
|
||||
tool = Tool.from_function(my_function, output_schema=False) # type: ignore[arg-type]
|
||||
|
||||
# Verify the tool was created with None as output_schema
|
||||
assert tool.output_schema is None
|
||||
|
||||
async def test_tool_from_tool_output_schema_false_deprecated(self):
|
||||
"""Test that Tool.from_tool(output_schema=False) shows deprecation warning."""
|
||||
|
||||
# Create a parent tool
|
||||
def parent_function() -> dict[str, str]:
|
||||
"""A parent function."""
|
||||
return {"status": "ok"}
|
||||
|
||||
parent_tool = Tool.from_function(parent_function)
|
||||
|
||||
with pytest.warns(
|
||||
DeprecationWarning, match="output_schema=False is deprecated"
|
||||
):
|
||||
transformed_tool = Tool.from_tool(parent_tool, output_schema=False) # type: ignore[arg-type]
|
||||
|
||||
# Verify the tool was created with None as output_schema
|
||||
assert transformed_tool.output_schema is None
|
||||
|
||||
async def test_output_schema_false_functionality_preserved(self):
|
||||
"""Test that output_schema=False still works functionally like output_schema=None."""
|
||||
mcp = FastMCP()
|
||||
|
||||
# Create two tools - one with False, one with None
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
|
||||
@mcp.tool(output_schema=False) # type: ignore[arg-type]
|
||||
def tool_with_false() -> dict[str, str]:
|
||||
"""Tool with output_schema=False."""
|
||||
return {"result": "false"}
|
||||
|
||||
@mcp.tool(output_schema=None)
|
||||
def tool_with_none() -> dict[str, str]:
|
||||
"""Tool with output_schema=None."""
|
||||
return {"result": "none"}
|
||||
|
||||
# Both should have None as output_schema
|
||||
assert mcp._tool_manager._tools["tool_with_false"].output_schema is None
|
||||
assert mcp._tool_manager._tools["tool_with_none"].output_schema is None
|
||||
|
||||
# Both should work the same way
|
||||
result_false = await mcp._tool_manager._tools["tool_with_false"].run({})
|
||||
result_none = await mcp._tool_manager._tools["tool_with_none"].run({})
|
||||
|
||||
# Both should return structured content for dict-like objects
|
||||
assert result_false.structured_content == {"result": "false"}
|
||||
assert result_none.structured_content == {"result": "none"}
|
||||
|
||||
async def test_output_schema_false_with_scalar_return(self):
|
||||
"""Test that output_schema=False works with scalar returns (no structured content)."""
|
||||
mcp = FastMCP()
|
||||
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
|
||||
@mcp.tool(output_schema=False) # type: ignore[arg-type]
|
||||
def scalar_tool() -> int:
|
||||
"""Tool returning a scalar."""
|
||||
return 42
|
||||
|
||||
tool = mcp._tool_manager._tools["scalar_tool"]
|
||||
assert tool.output_schema is None
|
||||
|
||||
result = await tool.run({})
|
||||
# Scalar values don't produce structured content
|
||||
assert result.structured_content is None
|
||||
assert len(result.content) == 1
|
||||
assert result.content[0].text == "42" # type: ignore[attr-defined]
|
||||
|
||||
async def test_transform_with_output_schema_false(self):
|
||||
"""Test that transformation with output_schema=False still works."""
|
||||
|
||||
# Create a parent tool
|
||||
def parent_function(x: int) -> dict[str, int]:
|
||||
"""A parent function."""
|
||||
return {"value": x * 2}
|
||||
|
||||
parent_tool = Tool.from_function(parent_function)
|
||||
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
|
||||
# Transform with output_schema=False
|
||||
transformed = Tool.from_tool(
|
||||
parent_tool,
|
||||
name="doubled",
|
||||
output_schema=False, # type: ignore[arg-type]
|
||||
)
|
||||
|
||||
assert transformed.output_schema is None
|
||||
|
||||
# Tool should still work
|
||||
result = await transformed.run({"x": 5})
|
||||
assert result.structured_content == {"value": 10}
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
"""Tests for deprecated FastMCPProxy client parameter."""
|
||||
|
||||
import warnings
|
||||
|
||||
import pytest
|
||||
|
||||
from fastmcp import Client, FastMCP
|
||||
from fastmcp.server.proxy import FastMCPProxy, ProxyClient
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def simple_server():
|
||||
"""Create a simple FastMCP server for testing."""
|
||||
server = FastMCP("TestServer")
|
||||
|
||||
@server.tool
|
||||
def simple_tool() -> str:
|
||||
return "test_result"
|
||||
|
||||
return server
|
||||
|
||||
|
||||
class TestDeprecatedClientParameter:
|
||||
"""Test the deprecated client parameter in FastMCPProxy."""
|
||||
|
||||
def test_client_parameter_deprecation_warning(self, simple_server):
|
||||
"""Test that using the client parameter raises a deprecation warning."""
|
||||
client = Client(simple_server)
|
||||
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
warnings.simplefilter("always") # Ensure all warnings are captured
|
||||
|
||||
FastMCPProxy(client=client)
|
||||
|
||||
# Verify a deprecation warning was raised
|
||||
assert len(w) == 1
|
||||
assert issubclass(w[0].category, DeprecationWarning)
|
||||
assert "client' to FastMCPProxy is deprecated" in str(w[0].message)
|
||||
assert "client_factory" in str(w[0].message)
|
||||
|
||||
def test_client_parameter_still_works(self, simple_server):
|
||||
"""Test that the deprecated client parameter still functions."""
|
||||
client = ProxyClient(simple_server)
|
||||
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore") # Suppress warnings for functionality test
|
||||
|
||||
proxy = FastMCPProxy(client=client)
|
||||
|
||||
# Verify the proxy was created successfully
|
||||
assert proxy is not None
|
||||
assert hasattr(proxy, "client_factory")
|
||||
assert callable(proxy.client_factory)
|
||||
|
||||
# Verify the factory returns a new client instance (session isolation for backwards compatibility)
|
||||
returned_client = proxy.client_factory()
|
||||
assert returned_client is not client
|
||||
assert isinstance(returned_client, type(client))
|
||||
|
||||
def test_cannot_specify_both_client_and_factory(self, simple_server):
|
||||
"""Test that specifying both client and client_factory raises an error."""
|
||||
client = Client(simple_server)
|
||||
|
||||
def factory():
|
||||
return Client(simple_server)
|
||||
|
||||
with pytest.raises(
|
||||
ValueError, match="Cannot specify both 'client' and 'client_factory'"
|
||||
):
|
||||
FastMCPProxy(client=client, client_factory=factory)
|
||||
|
||||
def test_must_specify_client_factory_when_no_client(self):
|
||||
"""Test that client_factory is required when client is not provided."""
|
||||
with pytest.raises(ValueError, match="Must specify 'client_factory'"):
|
||||
FastMCPProxy()
|
||||
|
||||
def test_client_factory_preferred_over_deprecated_client(self, simple_server):
|
||||
"""Test that the recommended client_factory approach works without warnings."""
|
||||
|
||||
def factory():
|
||||
return ProxyClient(simple_server)
|
||||
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
warnings.simplefilter("always")
|
||||
|
||||
proxy = FastMCPProxy(client_factory=factory)
|
||||
|
||||
# Verify no warnings were raised
|
||||
assert len(w) == 0
|
||||
|
||||
# Verify the proxy works correctly
|
||||
assert proxy is not None
|
||||
assert proxy.client_factory is factory
|
||||
|
||||
async def test_deprecated_client_functional_test(self, simple_server):
|
||||
"""End-to-end test that deprecated client parameter still works functionally."""
|
||||
client = ProxyClient(simple_server)
|
||||
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore")
|
||||
|
||||
proxy = FastMCPProxy(client=client)
|
||||
|
||||
# Test that the proxy can actually handle requests
|
||||
async with Client(proxy) as proxy_client:
|
||||
result = await proxy_client.call_tool("simple_tool", {})
|
||||
assert result.data == "test_result"
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
"""Tests for legacy resource prefix behavior."""
|
||||
|
||||
import pytest
|
||||
|
||||
from fastmcp import Client, FastMCP
|
||||
from fastmcp.server.server import (
|
||||
add_resource_prefix,
|
||||
has_resource_prefix,
|
||||
remove_resource_prefix,
|
||||
)
|
||||
from fastmcp.utilities.tests import temporary_settings
|
||||
|
||||
# reset deprecation warnings for this module
|
||||
pytestmark = pytest.mark.filterwarnings("default::DeprecationWarning")
|
||||
|
||||
|
||||
class TestLegacyResourcePrefixes:
|
||||
"""Test the legacy resource prefix behavior."""
|
||||
|
||||
def test_add_resource_prefix_legacy(self):
|
||||
"""Test that add_resource_prefix uses the legacy format when resource_prefix_format is 'protocol'."""
|
||||
with temporary_settings(resource_prefix_format="protocol"):
|
||||
result = add_resource_prefix("resource://path/to/resource", "prefix")
|
||||
assert result == "prefix+resource://path/to/resource"
|
||||
|
||||
# Empty prefix should return the original URI
|
||||
result = add_resource_prefix("resource://path/to/resource", "")
|
||||
assert result == "resource://path/to/resource"
|
||||
|
||||
def test_remove_resource_prefix_legacy(self):
|
||||
"""Test that remove_resource_prefix uses the legacy format when resource_prefix_format is 'protocol'."""
|
||||
with temporary_settings(resource_prefix_format="protocol"):
|
||||
result = remove_resource_prefix(
|
||||
"prefix+resource://path/to/resource", "prefix"
|
||||
)
|
||||
assert result == "resource://path/to/resource"
|
||||
|
||||
# URI without the prefix should be returned as is
|
||||
result = remove_resource_prefix("resource://path/to/resource", "prefix")
|
||||
assert result == "resource://path/to/resource"
|
||||
|
||||
# Empty prefix should return the original URI
|
||||
result = remove_resource_prefix("resource://path/to/resource", "")
|
||||
assert result == "resource://path/to/resource"
|
||||
|
||||
def test_has_resource_prefix_legacy(self):
|
||||
"""Test that has_resource_prefix uses the legacy format when resource_prefix_format is 'protocol'."""
|
||||
with temporary_settings(resource_prefix_format="protocol"):
|
||||
result = has_resource_prefix("prefix+resource://path/to/resource", "prefix")
|
||||
assert result is True
|
||||
|
||||
result = has_resource_prefix("resource://path/to/resource", "prefix")
|
||||
assert result is False
|
||||
|
||||
# Empty prefix should always return False
|
||||
result = has_resource_prefix("resource://path/to/resource", "")
|
||||
assert result is False
|
||||
|
||||
|
||||
async def test_mount_with_legacy_prefixes():
|
||||
"""Test mounting a server with legacy resource prefixes."""
|
||||
with temporary_settings(resource_prefix_format="protocol"):
|
||||
main_server = FastMCP("MainServer")
|
||||
sub_server = FastMCP("SubServer")
|
||||
|
||||
@sub_server.resource("resource://test")
|
||||
def get_test():
|
||||
return "test content"
|
||||
|
||||
# Mount the server with a prefix (using old argument order for this legacy test)
|
||||
with pytest.warns(DeprecationWarning, match="Mount prefixes are now optional"):
|
||||
main_server.mount("sub", sub_server) # type: ignore[arg-type]
|
||||
|
||||
# Check that the resource is prefixed using the legacy format
|
||||
resources = await main_server.get_resources()
|
||||
|
||||
# In legacy format, the key would be "sub+resource://test"
|
||||
assert "sub+resource://test" in resources
|
||||
|
||||
# Test accessing the resource through client
|
||||
async with Client(main_server) as client:
|
||||
result = await client.read_resource("sub+resource://test")
|
||||
# Different content types might be returned, but we just want to verify we got something
|
||||
assert len(result) > 0
|
||||
|
||||
|
||||
async def test_import_server_with_legacy_prefixes():
|
||||
"""Test importing a server with legacy resource prefixes."""
|
||||
with temporary_settings(resource_prefix_format="protocol"):
|
||||
main_server = FastMCP("MainServer")
|
||||
sub_server = FastMCP("SubServer")
|
||||
|
||||
@sub_server.resource("resource://test")
|
||||
def get_test():
|
||||
return "test content"
|
||||
|
||||
# Import the server with a prefix (using old argument order for this legacy test)
|
||||
with pytest.warns(DeprecationWarning, match="Import prefixes are now optional"):
|
||||
await main_server.import_server("sub", sub_server) # type: ignore[arg-type]
|
||||
|
||||
# Check that the resource is prefixed using the legacy format
|
||||
resources = await main_server.get_resources()
|
||||
|
||||
# In legacy format, the key would be "sub+resource://test"
|
||||
assert "sub+resource://test" in resources
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
import os
|
||||
import warnings
|
||||
from unittest.mock import patch
|
||||
|
||||
|
|
@ -179,7 +178,6 @@ class TestDeprecatedServerInitKwargs:
|
|||
on_duplicate_tools="warn",
|
||||
on_duplicate_resources="error",
|
||||
on_duplicate_prompts="replace",
|
||||
resource_prefix_format="path",
|
||||
mask_error_details=True,
|
||||
)
|
||||
|
||||
|
|
@ -304,39 +302,6 @@ class TestDeprecatedServerInitKwargs:
|
|||
assert "server.py" in warning.filename
|
||||
|
||||
|
||||
class TestDeprecatedEnvironmentVariables:
|
||||
"""Test deprecated environment variable prefixes."""
|
||||
|
||||
def test_fastmcp_server_env_var_deprecation_warning(self, caplog):
|
||||
"""Test that FASTMCP_SERVER_ environment variables emit deprecation warnings."""
|
||||
env_var_name = "FASTMCP_SERVER_HOST"
|
||||
original_value = os.environ.get(env_var_name)
|
||||
|
||||
try:
|
||||
os.environ[env_var_name] = "192.168.1.1"
|
||||
|
||||
with caplog_for_fastmcp(caplog):
|
||||
settings = Settings()
|
||||
|
||||
# Check that a warning was logged
|
||||
assert any(
|
||||
"Using `FASTMCP_SERVER_` environment variables is deprecated. Use `FASTMCP_` instead."
|
||||
in record.message
|
||||
for record in caplog.records
|
||||
if record.levelname == "WARNING"
|
||||
)
|
||||
|
||||
# Verify the setting is still applied
|
||||
assert settings.host == "192.168.1.1"
|
||||
|
||||
finally:
|
||||
# Clean up environment variable
|
||||
if original_value is not None:
|
||||
os.environ[env_var_name] = original_value
|
||||
else:
|
||||
os.environ.pop(env_var_name, None)
|
||||
|
||||
|
||||
class TestDeprecatedSettingsProperty:
|
||||
"""Test deprecated settings property access."""
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
import warnings
|
||||
from unittest.mock import MagicMock, patch
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
from mcp.types import ModelPreferences
|
||||
from starlette.requests import Request
|
||||
|
||||
from fastmcp.server.context import (
|
||||
Context,
|
||||
|
|
@ -12,58 +10,6 @@ from fastmcp.server.context import (
|
|||
from fastmcp.server.server import FastMCP
|
||||
|
||||
|
||||
class TestContextDeprecations:
|
||||
def test_get_http_request_deprecation_warning(self):
|
||||
"""Test that using Context.get_http_request() raises a deprecation warning."""
|
||||
# Create a mock FastMCP instance
|
||||
mock_fastmcp = MagicMock()
|
||||
context = Context(fastmcp=mock_fastmcp)
|
||||
|
||||
# Patch the dependency function to return a mock request
|
||||
mock_request = MagicMock(spec=Request)
|
||||
with patch(
|
||||
"fastmcp.server.dependencies.get_http_request", return_value=mock_request
|
||||
):
|
||||
# Check that the deprecation warning is raised
|
||||
with pytest.warns(
|
||||
DeprecationWarning, match="Context.get_http_request\\(\\) is deprecated"
|
||||
):
|
||||
request = context.get_http_request()
|
||||
|
||||
# Verify the function still works and returns the request
|
||||
assert request is mock_request
|
||||
|
||||
def test_get_http_request_deprecation_message(self):
|
||||
"""Test that the deprecation warning has the correct message with guidance."""
|
||||
# Create a mock FastMCP instance
|
||||
mock_fastmcp = MagicMock()
|
||||
context = Context(fastmcp=mock_fastmcp)
|
||||
|
||||
# Patch the dependency function to return a mock request
|
||||
mock_request = MagicMock(spec=Request)
|
||||
with patch(
|
||||
"fastmcp.server.dependencies.get_http_request", return_value=mock_request
|
||||
):
|
||||
# Capture and check the specific warning message
|
||||
with warnings.catch_warnings(record=True) as w:
|
||||
warnings.simplefilter("always")
|
||||
context.get_http_request()
|
||||
|
||||
assert len(w) == 1
|
||||
warning = w[0]
|
||||
assert issubclass(warning.category, DeprecationWarning)
|
||||
assert "Context.get_http_request() is deprecated" in str(
|
||||
warning.message
|
||||
)
|
||||
assert (
|
||||
"Use get_http_request() from fastmcp.server.dependencies instead"
|
||||
in str(warning.message)
|
||||
)
|
||||
assert "https://gofastmcp.com/servers/context#http-requests" in str(
|
||||
warning.message
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def context():
|
||||
return Context(fastmcp=FastMCP())
|
||||
|
|
|
|||
|
|
@ -391,25 +391,6 @@ async def test_import_with_proxy_resource_templates():
|
|||
assert content["email"] == "john@example.com"
|
||||
|
||||
|
||||
async def test_import_invalid_resource_prefix():
|
||||
main_app = FastMCP("MainApp")
|
||||
api_app = FastMCP("APIApp")
|
||||
|
||||
# This test doesn't apply anymore with the new prefix format since we're not validating
|
||||
# the protocol://prefix/path format
|
||||
# Just import the server to maintain test coverage without deprecated parameters
|
||||
await main_app.import_server(api_app, "api")
|
||||
|
||||
|
||||
async def test_import_invalid_resource_separator():
|
||||
main_app = FastMCP("MainApp")
|
||||
api_app = FastMCP("APIApp")
|
||||
|
||||
# This test is for maintaining coverage for importing with prefixes
|
||||
# We no longer pass the deprecated resource_separator parameter
|
||||
await main_app.import_server(api_app, "api")
|
||||
|
||||
|
||||
async def test_import_with_no_prefix():
|
||||
"""Test importing a server without providing a prefix."""
|
||||
main_app = FastMCP("MainApp")
|
||||
|
|
|
|||
|
|
@ -66,22 +66,6 @@ class TestBasicMount:
|
|||
result = await client.call_tool("sub_greet", {"name": "World"})
|
||||
assert result.data == "Hello, World!"
|
||||
|
||||
async def test_mount_invalid_resource_prefix(self):
|
||||
main_app = FastMCP("MainApp")
|
||||
api_app = FastMCP("APIApp")
|
||||
|
||||
# This test doesn't apply anymore with the new prefix format
|
||||
# just mount the server to maintain test coverage
|
||||
main_app.mount(api_app, "api:sub")
|
||||
|
||||
async def test_mount_invalid_resource_separator(self):
|
||||
main_app = FastMCP("MainApp")
|
||||
api_app = FastMCP("APIApp")
|
||||
|
||||
# This test doesn't apply anymore with the new prefix format
|
||||
# Mount without deprecated parameters
|
||||
main_app.mount(api_app, "api")
|
||||
|
||||
@pytest.mark.parametrize("prefix", ["", None])
|
||||
async def test_mount_with_no_prefix(self, prefix):
|
||||
main_app = FastMCP("MainApp")
|
||||
|
|
|
|||
|
|
@ -1,65 +0,0 @@
|
|||
"""Tests for different resource prefix formats in server mounting and importing."""
|
||||
|
||||
from fastmcp import FastMCP
|
||||
|
||||
|
||||
async def test_resource_prefix_format_in_constructor():
|
||||
"""Test that the resource_prefix_format parameter is respected in the constructor."""
|
||||
server_path = FastMCP("PathFormat", resource_prefix_format="path")
|
||||
server_protocol = FastMCP("ProtocolFormat", resource_prefix_format="protocol")
|
||||
|
||||
# Check that the format is stored correctly
|
||||
assert server_path.resource_prefix_format == "path"
|
||||
assert server_protocol.resource_prefix_format == "protocol"
|
||||
|
||||
# Register resources
|
||||
@server_path.resource("resource://test")
|
||||
def get_test_path():
|
||||
return "test content"
|
||||
|
||||
@server_protocol.resource("resource://test")
|
||||
def get_test_protocol():
|
||||
return "test content"
|
||||
|
||||
# Create mount servers
|
||||
main_server_path = FastMCP("MainPath", resource_prefix_format="path")
|
||||
main_server_protocol = FastMCP("MainProtocol", resource_prefix_format="protocol")
|
||||
|
||||
# Mount the servers
|
||||
main_server_path.mount(server_path, "sub")
|
||||
main_server_protocol.mount(server_protocol, "sub")
|
||||
|
||||
# Check that the resources are prefixed correctly
|
||||
path_resources = await main_server_path.get_resources()
|
||||
protocol_resources = await main_server_protocol.get_resources()
|
||||
|
||||
# Path format should be resource://sub/test
|
||||
assert "resource://sub/test" in path_resources
|
||||
# Protocol format should be sub+resource://test
|
||||
assert "sub+resource://test" in protocol_resources
|
||||
|
||||
|
||||
async def test_resource_prefix_format_in_import_server():
|
||||
"""Test that the resource_prefix_format parameter is respected in import_server."""
|
||||
server = FastMCP("TestServer")
|
||||
|
||||
@server.resource("resource://test")
|
||||
def get_test():
|
||||
return "test content"
|
||||
|
||||
# Import with path format
|
||||
main_server_path = FastMCP("MainPath", resource_prefix_format="path")
|
||||
await main_server_path.import_server(server, "sub")
|
||||
|
||||
# Import with protocol format
|
||||
main_server_protocol = FastMCP("MainProtocol", resource_prefix_format="protocol")
|
||||
await main_server_protocol.import_server(server, "sub")
|
||||
|
||||
# Check that the resources are prefixed correctly
|
||||
path_resources = await main_server_path._resource_manager.get_resources()
|
||||
protocol_resources = await main_server_protocol._resource_manager.get_resources()
|
||||
|
||||
# Path format should be resource://sub/test
|
||||
assert "resource://sub/test" in path_resources
|
||||
# Protocol format should be sub+resource://test
|
||||
assert "sub+resource://test" in protocol_resources
|
||||
|
|
@ -1287,20 +1287,11 @@ class TestResourcePrefixMounting:
|
|||
"""Test that resource prefix utility functions correctly match and strip resource prefixes."""
|
||||
from fastmcp.server.server import has_resource_prefix, remove_resource_prefix
|
||||
|
||||
# Create a basic server to get the default resource prefix format
|
||||
server = FastMCP()
|
||||
|
||||
# Test matching
|
||||
assert (
|
||||
has_resource_prefix(uri, prefix, server.resource_prefix_format)
|
||||
== expected_match
|
||||
)
|
||||
assert has_resource_prefix(uri, prefix) == expected_match
|
||||
|
||||
# Test stripping
|
||||
assert (
|
||||
remove_resource_prefix(uri, prefix, server.resource_prefix_format)
|
||||
== expected_strip
|
||||
)
|
||||
assert remove_resource_prefix(uri, prefix) == expected_strip
|
||||
|
||||
async def test_import_server_with_new_prefix_format(self):
|
||||
"""Test that import_server correctly uses the new prefix format."""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue