mirror of
https://github.com/PrefectHQ/fastmcp.git
synced 2026-08-21 04:54:17 +02:00
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Jeremiah Lowin <jlowin@users.noreply.github.com> Co-authored-by: Marvin Context Protocol <41898282+Marvin Context Protocol@users.noreply.github.com> Co-authored-by: voidborne-d <voidborne-d@users.noreply.github.com> Co-authored-by: marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: d 🔹 <258577966+voidborne-d@users.noreply.github.com> Co-authored-by: Jeremiah Lowin <153965+jlowin@users.noreply.github.com> Co-authored-by: nightcityblade <nightcityblade@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Bill Easton <strawgate@users.noreply.github.com> Co-authored-by: Sumanshu Nankana <sumanshunankana@gmail.com> Co-authored-by: Eric Robinson <ericrobinson@indeed.com> Co-authored-by: Martim Santos <martimfasantos@gmail.com> Co-authored-by: d 🔹 <liusway405@gmail.com> Co-authored-by: Matthieu B <66959271+mtthidoteu@users.noreply.github.com> Co-authored-by: Sascha Buehrle <47737812+saschabuehrle@users.noreply.github.com> Co-authored-by: Hakancan <142545736+hkc5@users.noreply.github.com> Co-authored-by: nightcityblade <jackchen@haloailabs.com> Co-authored-by: Matt Hallowell <17804673+mhallo@users.noreply.github.com> Co-authored-by: nate nowack <thrast36@gmail.com> Co-authored-by: Bill Easton <williamseaston@gmail.com> Co-authored-by: Marcus Shu <46469249+shulkx@users.noreply.github.com> Co-authored-by: Rushabh Doshi <radoshi@gmail.com> Co-authored-by: AIKAWA Shigechika <shige@aikawa.jp> Co-authored-by: Jeremy Simon <simonjer805@gmail.com> Co-authored-by: Miguel Miranda Dias <7780875+pandego@users.noreply.github.com> Co-authored-by: Anthony James Padavano <padavano.anthony@gmail.com> Co-authored-by: Mostafa Kamal <hiremostafa@gmail.com> Fix auto-close MRE script posting comment without closing (#3386) Fix WorkOS token scope verification bypass 🤖 Generated with Codex (#3407) Fix initialize McpError fallthrough 🤖 Generated with Codex (#3413) Fix transform arg collisions with passthrough params (#3431) Fix get_* returning None when latest version is disabled (#3439) Fix get_* returning None when latest version is disabled (#3421) Fix server lifespan overlap teardown (#3415) Fix $ref output schema object detection regression (#3420) resolved annotations (#3429) Fix async partial callables rejected by iscoroutinefunction (#3438) Fix async partial callables rejected by iscoroutinefunction (#3423) fix: add version to components (#3458) fix: use intent-based flag for OIDC scope patch in load_access_token (#3465) Fixes #3461 fix: normalize Google scope shorthands and surface valid_scopes (#3477) fix: resolve ty 0.0.23 type-checking errors and bump pin (#3481) fix: shield lifespan teardown from cancellation (#3480) fix: forward custom_route endpoints from mounted servers (#3462) fix updates _get_additional_http_routes() to traverse providers, Fixes #3457 fix: remove hardcoded version from CLI help text (#3456) fix: monty 0.0.8 compatibility, drop external_functions from constructor (#3468) fix: task test teardown hanging 5s per test (#3499) Closes #3498 fix: validate workspace path is a directory before cursor install (#3440) Fixes #3426 fix: handle re.error from malformed URI templates in build_regex (#3501) fix: reject empty/OIDC-only required_scopes in AzureProvider (#3503) fix: restrict $ref resolution to local refs only (SSRF/LFI) (#3502) fix warnings and timeouts (#3504) close upgrade check issue when build passes (#3505) Closes #3484 fix: URL-encode path params to prevent SSRF/path traversal (GHSA-vv7q-7jx5-f767) (#3507) fix: prevent path traversal in skill download (#3493) fix: prefer IdP-granted scopes over client-requested scopes in OAuthProxy (#3492) fix: remove unrelated transform and http.py changes from PR scope fix: remove forced follow_redirects from httpx_client_factory calls (#3496) fix: stop passing follow_redirects to httpx_client_factory fix: restore follow_redirects=True for custom httpx client factories Closes #3509 fix: CSRF double-submit cookie check in consent flow (#3519) fix: validate server names in install commands (#3522) fix: use raw strings for regex in pytest.raises match (#3523) fix: reject refresh tokens used as Bearer access tokens (#3524) fix: route ResourcesAsTools/PromptsAsTools through server middleware (#3495) fix: resolve Pyright "Module is not callable" on @tool, @resource, @prompt decorators (#3540) fix: filter warnings by message in KEY_PREFIX test (#3549) fix: suppress output schema for ToolResult subclass annotations (#3548) fix: increase sleep duration in proxy cache tests (#3567) fix: store absolute token expiry to prevent stale expires_in on reload (#3572) fix: preserve tool properties named 'title' during schema compression (#3582) Fix loopback redirect URI port matching per RFC 8252 §7.3 (#3589) Fix app tool routing: visibility check and middleware propagation (#3591) Fix query parameter serialization to respect OpenAPI explode/style settings (#3595) Fix dev apps form: union types, textarea support, JSON parsing (#3597) fix(google): replace deprecated /oauth2/v1/tokeninfo with /oauth2/v3/userinfo (#3603) fix: resolve EntraOBOToken dependency injection through MultiAuth (#3609) fix(docs): correct misleading stateless_http header (#3622) fix: filesystem provider import machinery (#3626) Closes #3625 (issues 2, 3, 6) fix: recover StdioTransport after subprocess exits (#3630) fix(server): preserve mounted tool task metadata (#3632) fix: scope deprecation warning filter to FastMCPDeprecationWarning (#3649) fix imports, add PrefabAppConfig (#3650) fix: resolve CurrentFastMCP/ctx.fastmcp to child server in mounted background tasks (#3651) Fix blocking docs issues: chart imports, Select API, Rx consistency (#3652) closed by default (#3657) Fix prompt caching middleware missing wrap/unwrap round-trip (#3666) fix: serialize object query params per OpenAPI style/explode rules (#3662) Fixes #2857 fix: HTTP request headers not accessible in background task workers (#3631) fix: restore HTTP headers in worker execution path for background tasks (#3681) fix: strip discriminator after dereferencing schemas (#3682) fix: remove stale ty:ignore directives for ty 0.0.26 (#3684) Fix docs gaps in app provider pages (#3690) fix: dev apps log panel UX improvements (#3698) fix dev server empty string args (#3700)
311 lines
11 KiB
Text
311 lines
11 KiB
Text
---
|
|
title: tool_transform
|
|
sidebarTitle: tool_transform
|
|
---
|
|
|
|
# `fastmcp.tools.tool_transform`
|
|
|
|
## Functions
|
|
|
|
### `forward` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L42" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
forward(**kwargs: Any) -> ToolResult
|
|
```
|
|
|
|
|
|
Forward to parent tool with argument transformation applied.
|
|
|
|
This function can only be called from within a transformed tool's custom
|
|
function. It applies argument transformation (renaming, validation) before
|
|
calling the parent tool.
|
|
|
|
For example, if the parent tool has args `x` and `y`, but the transformed
|
|
tool has args `a` and `b`, and an `transform_args` was provided that maps `x` to
|
|
`a` and `y` to `b`, then `forward(a=1, b=2)` will call the parent tool with
|
|
`x=1` and `y=2`.
|
|
|
|
**Args:**
|
|
- `**kwargs`: Arguments to forward to the parent tool (using transformed names).
|
|
|
|
**Returns:**
|
|
- The ToolResult from the parent tool execution.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called outside a transformed tool context.
|
|
- `TypeError`: If provided arguments don't match the transformed schema.
|
|
|
|
|
|
### `forward_raw` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L72" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
forward_raw(**kwargs: Any) -> ToolResult
|
|
```
|
|
|
|
|
|
Forward directly to parent tool without transformation.
|
|
|
|
This function bypasses all argument transformation and validation, calling the parent
|
|
tool directly with the provided arguments. Use this when you need to call the parent
|
|
with its original parameter names and structure.
|
|
|
|
For example, if the parent tool has args `x` and `y`, then `forward_raw(x=1,
|
|
y=2)` will call the parent tool with `x=1` and `y=2`.
|
|
|
|
**Args:**
|
|
- `**kwargs`: Arguments to pass directly to the parent tool (using original names).
|
|
|
|
**Returns:**
|
|
- The ToolResult from the parent tool execution.
|
|
|
|
**Raises:**
|
|
- `RuntimeError`: If called outside a transformed tool context.
|
|
|
|
|
|
### `apply_transformations_to_tools` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L976" 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]
|
|
```
|
|
|
|
|
|
Apply a list of transformations to a list of tools. Tools that do not have any transformations
|
|
are left unchanged.
|
|
|
|
Note: tools dict is keyed by prefixed key (e.g., "tool:my_tool"),
|
|
but transformations are keyed by tool name (e.g., "my_tool").
|
|
|
|
|
|
## Classes
|
|
|
|
### `ArgTransform` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L99" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
|
|
Configuration for transforming a parent tool's argument.
|
|
|
|
This class allows fine-grained control over how individual arguments are transformed
|
|
when creating a new tool from an existing one. You can rename arguments, change their
|
|
descriptions, add default values, or hide them from clients while passing constants.
|
|
|
|
**Attributes:**
|
|
- `name`: New name for the argument. Use None to keep original name, or ... for no change.
|
|
- `description`: New description for the argument. Use None to remove description, or ... for no change.
|
|
- `default`: New default value for the argument. Use ... for no change.
|
|
- `default_factory`: Callable that returns a default value. Cannot be used with default.
|
|
- `type`: New type for the argument. Use ... for no change.
|
|
- `hide`: If True, hide this argument from clients but pass a constant value to parent.
|
|
- `required`: If True, make argument required (remove default). Use ... for no change.
|
|
- `examples`: Examples for the argument. Use ... for no change.
|
|
|
|
**Examples:**
|
|
|
|
Rename argument 'old_name' to 'new_name'
|
|
```python
|
|
ArgTransform(name="new_name")
|
|
```
|
|
|
|
Change description only
|
|
```python
|
|
ArgTransform(description="Updated description")
|
|
```
|
|
|
|
Add a default value (makes argument optional)
|
|
```python
|
|
ArgTransform(default=42)
|
|
```
|
|
|
|
Add a default factory (makes argument optional)
|
|
```python
|
|
ArgTransform(default_factory=lambda: time.time())
|
|
```
|
|
|
|
Change the type
|
|
```python
|
|
ArgTransform(type=str)
|
|
```
|
|
|
|
Hide the argument entirely from clients
|
|
```python
|
|
ArgTransform(hide=True)
|
|
```
|
|
|
|
Hide argument but pass a constant value to parent
|
|
```python
|
|
ArgTransform(hide=True, default="constant_value")
|
|
```
|
|
|
|
Hide argument but pass a factory-generated value to parent
|
|
```python
|
|
ArgTransform(hide=True, default_factory=lambda: uuid.uuid4().hex)
|
|
```
|
|
|
|
Make an optional parameter required (removes any default)
|
|
```python
|
|
ArgTransform(required=True)
|
|
```
|
|
|
|
Combine multiple transformations
|
|
```python
|
|
ArgTransform(name="new_name", description="New desc", default=None, type=int)
|
|
```
|
|
|
|
|
|
### `ArgTransformConfig` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L213" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
|
|
A model for requesting a single argument transform.
|
|
|
|
|
|
**Methods:**
|
|
|
|
#### `to_arg_transform` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L231" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
to_arg_transform(self) -> ArgTransform
|
|
```
|
|
|
|
Convert the argument transform to a FastMCP argument transform.
|
|
|
|
|
|
### `TransformedTool` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L237" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
|
|
A tool that is transformed from another tool.
|
|
|
|
This class represents a tool that has been created by transforming another tool.
|
|
It supports argument renaming, schema modification, custom function injection,
|
|
structured output control, and provides context for the forward() and forward_raw() functions.
|
|
|
|
The transformation can be purely schema-based (argument renaming, dropping, etc.)
|
|
or can include a custom function that uses forward() to call the parent tool
|
|
with transformed arguments. Output schemas and structured outputs are automatically
|
|
inherited from the parent tool but can be overridden or disabled.
|
|
|
|
**Attributes:**
|
|
- `parent_tool`: The original tool that this tool was transformed from.
|
|
- `fn`: The function to execute when this tool is called (either the forwarding
|
|
function for pure transformations or a custom user function).
|
|
- `forwarding_fn`: Internal function that handles argument transformation and
|
|
validation when forward() is called from custom functions.
|
|
|
|
|
|
**Methods:**
|
|
|
|
#### `run` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L266" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
run(self, arguments: dict[str, Any]) -> ToolResult
|
|
```
|
|
|
|
Run the tool with context set for forward() functions.
|
|
|
|
This method executes the tool's function while setting up the context
|
|
that allows forward() and forward_raw() to work correctly within custom
|
|
functions.
|
|
|
|
**Args:**
|
|
- `arguments`: Dictionary of arguments to pass to the tool's function.
|
|
|
|
**Returns:**
|
|
- ToolResult object containing content and optional structured output.
|
|
|
|
|
|
#### `from_tool` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L362" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
from_tool(cls, tool: Tool | Callable[..., Any], name: str | None = None, version: str | NotSetT | None = NotSet, 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) -> TransformedTool
|
|
```
|
|
|
|
Create a transformed tool from a parent tool.
|
|
|
|
**Args:**
|
|
- `tool`: The parent tool to transform.
|
|
- `transform_fn`: Optional custom function. Can use forward() and forward_raw()
|
|
to call the parent tool. Functions with **kwargs receive transformed
|
|
argument names.
|
|
- `name`: New name for the tool. Defaults to parent tool's name.
|
|
- `version`: New version for the tool. Defaults to parent tool's version.
|
|
- `title`: New title for the tool. Defaults to parent tool's title.
|
|
- `transform_args`: Optional transformations for parent tool arguments.
|
|
Only specified arguments are transformed, others pass through unchanged\:
|
|
- Simple rename (str)
|
|
- Complex transformation (rename/description/default/drop) (ArgTransform)
|
|
- Drop the argument (None)
|
|
- `description`: New description. Defaults to parent's description.
|
|
- `tags`: New tags. Defaults to parent's tags.
|
|
- `annotations`: New annotations. Defaults to parent's annotations.
|
|
- `output_schema`: Control output schema for structured outputs\:
|
|
- None (default)\: Inherit from transform_fn if available, then parent tool
|
|
- dict\: Use custom output schema
|
|
- False\: Disable output schema and structured outputs
|
|
- `serializer`: Deprecated. Return ToolResult from your tools for full control over serialization.
|
|
- `meta`: Control meta information\:
|
|
- NotSet (default)\: Inherit from parent tool
|
|
- dict\: Use custom meta information
|
|
- None\: Remove meta information
|
|
|
|
**Returns:**
|
|
- TransformedTool with the specified transformations.
|
|
|
|
**Examples:**
|
|
|
|
# Transform specific arguments only
|
|
```python
|
|
Tool.from_tool(parent, transform_args={"old": "new"}) # Others unchanged
|
|
```
|
|
|
|
# Custom function with partial transforms
|
|
```python
|
|
async def custom(x: int, y: int) -> str:
|
|
result = await forward(x=x, y=y)
|
|
return f"Custom: {result}"
|
|
|
|
Tool.from_tool(parent, transform_fn=custom, transform_args={"a": "x", "b": "y"})
|
|
```
|
|
|
|
# Using **kwargs (gets all args, transformed and untransformed)
|
|
```python
|
|
async def flexible(**kwargs) -> str:
|
|
result = await forward(**kwargs)
|
|
return f"Got: {kwargs}"
|
|
|
|
Tool.from_tool(parent, transform_fn=flexible, transform_args={"a": "x"})
|
|
```
|
|
|
|
# Control structured outputs and schemas
|
|
```python
|
|
# Custom output schema
|
|
Tool.from_tool(parent, output_schema={
|
|
"type": "object",
|
|
"properties": {"status": {"type": "string"}}
|
|
})
|
|
|
|
# Disable structured outputs
|
|
Tool.from_tool(parent, output_schema=None)
|
|
|
|
# Return ToolResult for full control
|
|
async def custom_output(**kwargs) -> ToolResult:
|
|
result = await forward(**kwargs)
|
|
return ToolResult(
|
|
content=[TextContent(text="Summary")],
|
|
structured_content={"processed": True}
|
|
)
|
|
```
|
|
|
|
|
|
### `ToolTransformConfig` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L922" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
|
|
Provides a way to transform a tool.
|
|
|
|
|
|
**Methods:**
|
|
|
|
#### `apply` <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/tools/tool_transform.py#L955" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>
|
|
|
|
```python
|
|
apply(self, tool: Tool) -> TransformedTool
|
|
```
|
|
|
|
Create a TransformedTool from a provided tool and this transformation configuration.
|
|
|