Skip to content

Commit 70d2d28

Browse files
committed
Updates to Proxy Tool
1 parent 7d5ad06 commit 70d2d28

File tree

13 files changed

+680
-456
lines changed

13 files changed

+680
-456
lines changed

src/fastmcp/contrib/tool_transformer/README.md

Lines changed: 43 additions & 45 deletions
Large diffs are not rendered by default.
Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,26 @@
1-
from fastmcp.contrib.tool_transformer.base import (
2-
ToolParameterOverrideError,
3-
TransformedToolError,
4-
)
5-
from fastmcp.contrib.tool_transformer.tool_transformer import transform_tool
6-
7-
8-
from fastmcp.contrib.tool_transformer.types import (
9-
ExtraParameterNumber,
10-
ExtraParameterString,
11-
ExtraParameterBoolean,
12-
ExtraToolParameterTypes,
1+
from fastmcp.contrib.tool_transformer.models import (
2+
BooleanToolParameter,
3+
FloatToolParameter,
4+
IntToolParameter,
135
PostToolCallHookProtocol,
146
PreToolCallHookProtocol,
15-
ToolParameterOverride,
7+
StringToolParameter,
8+
ToolOverride,
9+
ToolParameter,
10+
ToolParameterTypes,
1611
)
17-
12+
from fastmcp.contrib.tool_transformer.tool_transformer import proxy_tool, transform_tool
1813

1914
__all__ = [
20-
"ExtraParameterBoolean",
21-
"ExtraParameterNumber",
22-
"ExtraParameterString",
23-
"ExtraToolParameterTypes",
15+
"BooleanToolParameter",
16+
"FloatToolParameter",
17+
"IntToolParameter",
2418
"PostToolCallHookProtocol",
2519
"PreToolCallHookProtocol",
26-
"ToolParameterOverride",
27-
"ToolParameterOverrideError",
28-
"TransformedToolError",
20+
"StringToolParameter",
21+
"ToolOverride",
22+
"ToolParameter",
23+
"ToolParameterTypes",
24+
"proxy_tool",
2925
"transform_tool",
3026
]

src/fastmcp/contrib/tool_transformer/base.py

Lines changed: 0 additions & 126 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class TransformedToolError(Exception):
2+
"""An error that occurs when a tool is transformed."""
3+
4+
def __init__(self, message: str):
5+
super().__init__(message)
6+
7+
8+
class ToolParameterOverrideError(TransformedToolError):
9+
"""An error that occurs when a parameter override is invalid."""
10+
11+
def __init__(self, parameter_name: str):
12+
super().__init__(f"Parameter {parameter_name} not found in tool.")
13+
14+
15+
class ToolParameterNotFoundError(TransformedToolError):
16+
"""An error that occurs when a parameter is not found in the schema."""
17+
18+
def __init__(self, parameter_name: str):
19+
super().__init__(f"Parameter {parameter_name} not found in tool.")
20+
21+
22+
class ToolParameterAlreadyExistsError(TransformedToolError):
23+
"""An error that occurs when a parameter already exists in the schema."""
24+
25+
def __init__(self, parameter_name: str):
26+
super().__init__(f"Parameter {parameter_name} already exists in schema.")

src/fastmcp/contrib/tool_transformer/example-hooks.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55

66
from fastmcp import FastMCP
77
from fastmcp.client import Client
8-
from fastmcp.contrib.tool_transformer.tool_transformer import (
9-
transform_tool,
10-
)
11-
from fastmcp.tools.tool_manager import ToolError
8+
from fastmcp.exceptions import ToolError
9+
10+
from fastmcp.contrib.tool_transformer.tool_transformer import proxy_tool
1211

1312
third_party_mcp_config = {
1413
"time": {
@@ -36,9 +35,11 @@ async def pre_call_hook(
3635
if tool_args.get("source_timezone") == "America/New_York":
3736
raise ToolError("New Yorkers are not allowed to use this tool.")
3837

39-
transform_tool(
38+
proxy_tool(
4039
proxied_tools["convert_time"],
4140
frontend_server,
41+
name="transformed_convert_time",
42+
description="Converts a time from New York to another timezone.",
4243
pre_call_hook=pre_call_hook,
4344
)
4445

src/fastmcp/contrib/tool_transformer/example-overrides-yaml.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
"""Sample code for FastMCP using InterceptingProxyTool."""
22

33
import asyncio
4+
from pathlib import Path
45

6+
import yaml
57
from fastmcp import FastMCP
68
from fastmcp.client import Client
7-
from fastmcp.contrib.tool_transformer.loader import (
8-
ToolOverrides,
9-
transform_tools_from_server,
10-
)
9+
10+
from fastmcp.contrib.tool_transformer import proxy_tool
11+
from fastmcp.contrib.tool_transformer.loader import overrides_from_yaml_file
1112

1213
third_party_mcp_config = {
1314
"time": {
@@ -19,32 +20,36 @@
1920
}
2021
}
2122

22-
override_config_yaml = ToolOverrides.from_yaml("""
23+
override_config_yaml = yaml.safe_load("""
2324
tools:
24-
convert_time:
25+
- convert_time:
2526
description: >-
2627
An updated multi-line description
2728
for the time tool.
2829
parameter_overrides:
29-
source_timezone:
30+
source_timezone:
3031
description: This field now has a description and a constant value
3132
constant: America/New_York
32-
time:
33+
time:
3334
description: This field now has a description and a default value
3435
default: "3:00"
3536
""")
3637

3738

3839
async def async_main():
3940
async with Client(third_party_mcp_config) as remote_mcp_client:
40-
proxied_mcp_server = FastMCP.as_proxy(remote_mcp_client)
41+
backend_server = FastMCP.as_proxy(remote_mcp_client)
42+
43+
backend_tools = await backend_server.get_tools()
4144

4245
frontend_server = FastMCP("Frontend Server")
4346

44-
await transform_tools_from_server(
45-
proxied_mcp_server,
46-
frontend_server,
47-
overrides=override_config_yaml,
47+
tool_overrides = overrides_from_yaml_file(Path("override_config.yaml"))
48+
49+
proxy_tool(
50+
tool=backend_tools["convert_time"],
51+
server=frontend_server,
52+
override=tool_overrides["convert_time"],
4853
)
4954

5055
await frontend_server.run_async(transport="sse")

src/fastmcp/contrib/tool_transformer/example-overrides.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
from fastmcp import FastMCP
66
from fastmcp.client import Client
7+
78
from fastmcp.contrib.tool_transformer.tool_transformer import (
8-
transform_tool,
9+
proxy_tool,
910
)
10-
from fastmcp.contrib.tool_transformer.types import ToolParameterOverride
11+
from fastmcp.contrib.tool_transformer.models import ToolParameter
1112

1213
third_party_mcp_config = {
1314
"time": {
@@ -21,29 +22,31 @@
2122

2223

2324
async def async_main():
24-
async with Client(third_party_mcp_config) as remote_mcp_client:
25+
async with Client(third_party_mcp_config, timeout=30) as remote_mcp_client:
2526
proxied_mcp_server = FastMCP.as_proxy(remote_mcp_client)
2627

2728
proxied_tools = await proxied_mcp_server.get_tools()
2829

2930
frontend_server = FastMCP("Frontend Server")
3031

31-
transform_tool(
32+
proxy_tool(
3233
proxied_tools["convert_time"],
33-
frontend_server,
34+
server=frontend_server,
3435
name="transformed_convert_time",
3536
description="Converts a time from New York to another timezone.",
36-
parameter_overrides={
37-
"source_timezone": ToolParameterOverride(
37+
parameter_overrides=[
38+
ToolParameter[str](
39+
name="source_timezone",
3840
description="The timezone of the time to convert.",
3941
constant="America/New_York", # Source Timezone is now required to be America/New_York
4042
),
41-
"time": ToolParameterOverride(
43+
ToolParameter[str](
44+
name="time",
4245
description="The time to convert. Must be in the format HH:MM. Default is 3:00.",
4346
default="3:00", # Time now defaults to 3:00
4447
),
4548
# No override of the override the target_timezone parameter
46-
},
49+
],
4750
)
4851

4952
await frontend_server.run_async(transport="sse")

0 commit comments

Comments
 (0)