mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-09 15:19:10 +02:00
499 lines
18 KiB
Text
499 lines
18 KiB
Text
---
|
|
title: client
|
|
sidebarTitle: client
|
|
---
|
|
|
|
# `fastmcp.client.client`
|
|
|
|
## Classes
|
|
|
|
### `ClientSessionState` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L74" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
|
|
Holds all session-related state for a Client instance.
|
|
|
|
This allows clean separation of configuration (which is copied) from
|
|
session state (which should be fresh for each new client instance).
|
|
|
|
|
|
### `Client` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L90" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
|
|
MCP client that delegates connection management to a Transport instance.
|
|
|
|
The Client class is responsible for MCP protocol logic, while the Transport
|
|
handles connection establishment and management. Client provides methods for
|
|
working with resources, prompts, tools and other MCP capabilities.
|
|
|
|
This client supports reentrant context managers (multiple concurrent
|
|
`async with client:` blocks) using reference counting and background session
|
|
management. This allows efficient session reuse in any scenario with
|
|
nested or concurrent client usage.
|
|
|
|
MCP SDK 1.10 introduced automatic list_tools() calls during call_tool()
|
|
execution. This created a race condition where events could be reset while
|
|
other tasks were waiting on them, causing deadlocks. The issue was exposed
|
|
in proxy scenarios but affects any reentrant usage.
|
|
|
|
The solution uses reference counting to track active context managers,
|
|
a background task to manage the session lifecycle, events to coordinate
|
|
between tasks, and ensures all session state changes happen within a lock.
|
|
Events are only created when needed, never reset outside locks.
|
|
|
|
This design prevents race conditions where tasks wait on events that get
|
|
replaced by other tasks, ensuring reliable coordination in concurrent scenarios.
|
|
|
|
**Args:**
|
|
- `transport`:
|
|
Connection source specification, which can be\:
|
|
|
|
- ClientTransport\: Direct transport instance
|
|
- FastMCP\: In-process FastMCP server
|
|
- AnyUrl or str\: URL to connect to
|
|
- Path\: File path for local socket
|
|
- MCPConfig\: MCP server configuration
|
|
- dict\: Transport configuration
|
|
- `roots`: Optional RootsList or RootsHandler for filesystem access
|
|
- `sampling_handler`: Optional handler for sampling requests
|
|
- `log_handler`: Optional handler for log messages
|
|
- `message_handler`: Optional handler for protocol messages
|
|
- `progress_handler`: Optional handler for progress notifications
|
|
- `timeout`: Optional timeout for requests (seconds or timedelta)
|
|
- `init_timeout`: Optional timeout for initial connection (seconds or timedelta).
|
|
Set to 0 to disable. If None, uses the value in the FastMCP global settings.
|
|
|
|
**Examples:**
|
|
|
|
```python
|
|
# Connect to FastMCP server
|
|
client = Client("http://localhost:8080")
|
|
|
|
async with client:
|
|
# List available resources
|
|
resources = await client.list_resources()
|
|
|
|
# Call a tool
|
|
result = await client.call_tool("my_tool", {"param": "value"})
|
|
```
|
|
|
|
|
|
**Methods:**
|
|
|
|
#### `session` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L273" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
session(self) -> ClientSession
|
|
```
|
|
|
|
Get the current active session. Raises RuntimeError if not connected.
|
|
|
|
|
|
#### `initialize_result` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L283" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
initialize_result(self) -> mcp.types.InitializeResult
|
|
```
|
|
|
|
Get the result of the initialization request.
|
|
|
|
|
|
#### `set_roots` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L291" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
set_roots(self, roots: RootsList | RootsHandler) -> None
|
|
```
|
|
|
|
Set the roots for the client. This does not automatically call `send_roots_list_changed`.
|
|
|
|
|
|
#### `set_sampling_callback` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L295" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
set_sampling_callback(self, sampling_callback: SamplingHandler) -> None
|
|
```
|
|
|
|
Set the sampling callback for the client.
|
|
|
|
|
|
#### `set_elicitation_callback` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L301" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
set_elicitation_callback(self, elicitation_callback: ElicitationHandler) -> None
|
|
```
|
|
|
|
Set the elicitation callback for the client.
|
|
|
|
|
|
#### `is_connected` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L309" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
is_connected(self) -> bool
|
|
```
|
|
|
|
Check if the client is currently connected.
|
|
|
|
|
|
#### `new` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L313" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
new(self) -> Client[ClientTransportT]
|
|
```
|
|
|
|
Create a new client instance with the same configuration but fresh session state.
|
|
|
|
This creates a new client with the same transport, handlers, and configuration,
|
|
but with no active session. Useful for creating independent sessions that don't
|
|
share state with the original client.
|
|
|
|
**Returns:**
|
|
- A new Client instance with the same configuration but disconnected state.
|
|
|
|
|
|
#### `close` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L476" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
close(self)
|
|
```
|
|
|
|
#### `ping` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L482" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
ping(self) -> bool
|
|
```
|
|
|
|
Send a ping request.
|
|
|
|
|
|
#### `cancel` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L487" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
cancel(self, request_id: str | int, reason: str | None = None) -> None
|
|
```
|
|
|
|
Send a cancellation notification for an in-progress request.
|
|
|
|
|
|
#### `progress` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L504" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
progress(self, progress_token: str | int, progress: float, total: float | None = None, message: str | None = None) -> None
|
|
```
|
|
|
|
Send a progress notification.
|
|
|
|
|
|
#### `set_logging_level` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L516" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
set_logging_level(self, level: mcp.types.LoggingLevel) -> None
|
|
```
|
|
|
|
Send a logging/setLevel request.
|
|
|
|
|
|
#### `send_roots_list_changed` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L520" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
send_roots_list_changed(self) -> None
|
|
```
|
|
|
|
Send a roots/list_changed notification.
|
|
|
|
|
|
#### `list_resources_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L526" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_resources_mcp(self) -> mcp.types.ListResourcesResult
|
|
```
|
|
|
|
Send a resources/list request and return the complete MCP protocol result.
|
|
|
|
**Returns:**
|
|
- mcp.types.ListResourcesResult: The complete response object from the protocol,
|
|
containing the list of resources and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `list_resources` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L539" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_resources(self) -> list[mcp.types.Resource]
|
|
```
|
|
|
|
Retrieve a list of resources available on the server.
|
|
|
|
**Returns:**
|
|
- list\[mcp.types.Resource]: A list of Resource objects.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `list_resource_templates_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L551" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_resource_templates_mcp(self) -> mcp.types.ListResourceTemplatesResult
|
|
```
|
|
|
|
Send a resources/listResourceTemplates request and return the complete MCP protocol result.
|
|
|
|
**Returns:**
|
|
- mcp.types.ListResourceTemplatesResult: The complete response object from the protocol,
|
|
containing the list of resource templates and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `list_resource_templates` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L566" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_resource_templates(self) -> list[mcp.types.ResourceTemplate]
|
|
```
|
|
|
|
Retrieve a list of resource templates available on the server.
|
|
|
|
**Returns:**
|
|
- list\[mcp.types.ResourceTemplate]: A list of ResourceTemplate objects.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `read_resource_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L580" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
read_resource_mcp(self, uri: AnyUrl | str) -> mcp.types.ReadResourceResult
|
|
```
|
|
|
|
Send a resources/read request and return the complete MCP protocol result.
|
|
|
|
**Args:**
|
|
- `uri`: The URI of the resource to read. Can be a string or an AnyUrl object.
|
|
|
|
**Returns:**
|
|
- mcp.types.ReadResourceResult: The complete response object from the protocol,
|
|
containing the resource contents and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `read_resource` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L600" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
read_resource(self, uri: AnyUrl | str) -> list[mcp.types.TextResourceContents | mcp.types.BlobResourceContents]
|
|
```
|
|
|
|
Read the contents of a resource or resolved template.
|
|
|
|
**Args:**
|
|
- `uri`: The URI of the resource to read. Can be a string or an AnyUrl object.
|
|
|
|
**Returns:**
|
|
- list\[mcp.types.TextResourceContents | mcp.types.BlobResourceContents]: A list of content
|
|
objects, typically containing either text or binary data.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `list_prompts_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L639" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_prompts_mcp(self) -> mcp.types.ListPromptsResult
|
|
```
|
|
|
|
Send a prompts/list request and return the complete MCP protocol result.
|
|
|
|
**Returns:**
|
|
- mcp.types.ListPromptsResult: The complete response object from the protocol,
|
|
containing the list of prompts and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `list_prompts` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L652" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_prompts(self) -> list[mcp.types.Prompt]
|
|
```
|
|
|
|
Retrieve a list of prompts available on the server.
|
|
|
|
**Returns:**
|
|
- list\[mcp.types.Prompt]: A list of Prompt objects.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `get_prompt_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L665" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
get_prompt_mcp(self, name: str, arguments: dict[str, Any] | None = None) -> mcp.types.GetPromptResult
|
|
```
|
|
|
|
Send a prompts/get request and return the complete MCP protocol result.
|
|
|
|
**Args:**
|
|
- `name`: The name of the prompt to retrieve.
|
|
- `arguments`: Arguments to pass to the prompt. Defaults to None.
|
|
|
|
**Returns:**
|
|
- mcp.types.GetPromptResult: The complete response object from the protocol,
|
|
containing the prompt messages and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `get_prompt` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L699" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
get_prompt(self, name: str, arguments: dict[str, Any] | None = None) -> mcp.types.GetPromptResult
|
|
```
|
|
|
|
Retrieve a rendered prompt message list from the server.
|
|
|
|
**Args:**
|
|
- `name`: The name of the prompt to retrieve.
|
|
- `arguments`: Arguments to pass to the prompt. Defaults to None.
|
|
|
|
**Returns:**
|
|
- mcp.types.GetPromptResult: The complete response object from the protocol,
|
|
containing the prompt messages and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `complete_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L720" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
complete_mcp(self, ref: mcp.types.ResourceReference | mcp.types.PromptReference, argument: dict[str, str]) -> mcp.types.CompleteResult
|
|
```
|
|
|
|
Send a completion request and return the complete MCP protocol result.
|
|
|
|
**Args:**
|
|
- `ref`: The reference to complete.
|
|
- `argument`: Arguments to pass to the completion request.
|
|
|
|
**Returns:**
|
|
- mcp.types.CompleteResult: The complete response object from the protocol,
|
|
containing the completion and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `complete` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L741" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
complete(self, ref: mcp.types.ResourceReference | mcp.types.PromptReference, argument: dict[str, str]) -> mcp.types.Completion
|
|
```
|
|
|
|
Send a completion request to the server.
|
|
|
|
**Args:**
|
|
- `ref`: The reference to complete.
|
|
- `argument`: Arguments to pass to the completion request.
|
|
|
|
**Returns:**
|
|
- mcp.types.Completion: The completion object.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `list_tools_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L763" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_tools_mcp(self) -> mcp.types.ListToolsResult
|
|
```
|
|
|
|
Send a tools/list request and return the complete MCP protocol result.
|
|
|
|
**Returns:**
|
|
- mcp.types.ListToolsResult: The complete response object from the protocol,
|
|
containing the list of tools and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `list_tools` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L776" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
list_tools(self) -> list[mcp.types.Tool]
|
|
```
|
|
|
|
Retrieve a list of tools available on the server.
|
|
|
|
**Returns:**
|
|
- list\[mcp.types.Tool]: A list of Tool objects.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `call_tool_mcp` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L790" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
call_tool_mcp(self, name: str, arguments: dict[str, Any], progress_handler: ProgressHandler | None = None, timeout: datetime.timedelta | float | int | None = None) -> mcp.types.CallToolResult
|
|
```
|
|
|
|
Send a tools/call request and return the complete MCP protocol result.
|
|
|
|
This method returns the raw CallToolResult object, which includes an isError flag
|
|
and other metadata. It does not raise an exception if the tool call results in an error.
|
|
|
|
**Args:**
|
|
- `name`: The name of the tool to call.
|
|
- `arguments`: Arguments to pass to the tool.
|
|
- `timeout`: The timeout for the tool call. Defaults to None.
|
|
- `progress_handler`: The progress handler to use for the tool call. Defaults to None.
|
|
|
|
**Returns:**
|
|
- mcp.types.CallToolResult: The complete response object from the protocol,
|
|
containing the tool result and any additional metadata.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
#### `call_tool` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L826" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
call_tool(self, name: str, arguments: dict[str, Any] | None = None, timeout: datetime.timedelta | float | int | None = None, progress_handler: ProgressHandler | None = None, raise_on_error: bool = True) -> CallToolResult
|
|
```
|
|
|
|
Call a tool on the server.
|
|
|
|
Unlike call_tool_mcp, this method raises a ToolError if the tool call results in an error.
|
|
|
|
**Args:**
|
|
- `name`: The name of the tool to call.
|
|
- `arguments`: Arguments to pass to the tool. Defaults to None.
|
|
- `timeout`: The timeout for the tool call. Defaults to None.
|
|
- `progress_handler`: The progress handler to use for the tool call. Defaults to None.
|
|
|
|
**Returns:**
|
|
-
|
|
The content returned by the tool. If the tool returns structured
|
|
outputs, they are returned as a dataclass (if an output schema
|
|
is available) or a dictionary; otherwise, a list of content
|
|
blocks is returned. Note: to receive both structured and
|
|
unstructured outputs, use call_tool_mcp instead and access the
|
|
raw result object.
|
|
|
|
**Raises:**
|
|
- `ToolError`: If the tool call results in an error.
|
|
- `RuntimeError`: If called while the client is not connected.
|
|
|
|
|
|
### `CallToolResult` <sup><a href="https://github.com/jlowin/fastmcp/blob/main/src/fastmcp/client/client.py#L898" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|