Skip to content

Commit 419e8d3

Browse files
committed
change an example to remove exceptions and warnings for parsing
1 parent d6a51f7 commit 419e8d3

File tree

4 files changed

+57
-75
lines changed

4 files changed

+57
-75
lines changed

README.md

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,12 +1039,7 @@ For more control, you can use the low-level server implementation directly. This
10391039

10401040
<!-- snippet-source examples/snippets/servers/lowlevel/lifespan.py -->
10411041
```python
1042-
"""Low-level server example showing lifespan management.
1043-
1044-
This example demonstrates how to use the lifespan API to manage
1045-
server startup and shutdown, including resource initialization
1046-
and cleanup.
1047-
1042+
"""
10481043
Run from the repository root:
10491044
uv run examples/snippets/servers/lowlevel/lifespan.py
10501045
"""
@@ -1160,13 +1155,9 @@ The lifespan API provides:
11601155

11611156
<!-- snippet-source examples/snippets/servers/lowlevel/basic.py -->
11621157
```python
1163-
"""Basic low-level server example.
1164-
1165-
This example demonstrates the low-level server API with minimal setup,
1166-
showing how to implement basic prompts using the raw protocol handlers.
1167-
1158+
"""
11681159
Run from the repository root:
1169-
uv run examples/snippets/servers/lowlevel/basic.py
1160+
uv run examples/snippets/servers/lowlevel/basic.py
11701161
"""
11711162

11721163
import asyncio
@@ -1198,7 +1189,7 @@ async def handle_get_prompt(name: str, arguments: dict[str, str] | None) -> type
11981189
if name != "example-prompt":
11991190
raise ValueError(f"Unknown prompt: {name}")
12001191

1201-
arg1_value = arguments.get("arg1", "default") if arguments else "default"
1192+
arg1_value = (arguments or {}).get("arg1", "default")
12021193

12031194
return types.GetPromptResult(
12041195
description="Example prompt",
@@ -1243,11 +1234,7 @@ The low-level server supports structured output for tools, allowing you to retur
12431234

12441235
<!-- snippet-source examples/snippets/servers/lowlevel/structured_output.py -->
12451236
```python
1246-
"""Low-level server example showing structured output support.
1247-
1248-
This example demonstrates how to use the low-level server API to return
1249-
structured data from tools, with automatic validation against output schemas.
1250-
1237+
"""
12511238
Run from the repository root:
12521239
uv run examples/snippets/servers/lowlevel/structured_output.py
12531240
"""
@@ -1268,20 +1255,22 @@ async def list_tools() -> list[types.Tool]:
12681255
"""List available tools with structured output schemas."""
12691256
return [
12701257
types.Tool(
1271-
name="calculate",
1272-
description="Perform mathematical calculations",
1258+
name="get_weather",
1259+
description="Get current weather for a city",
12731260
inputSchema={
12741261
"type": "object",
1275-
"properties": {"expression": {"type": "string", "description": "Math expression"}},
1276-
"required": ["expression"],
1262+
"properties": {"city": {"type": "string", "description": "City name"}},
1263+
"required": ["city"],
12771264
},
12781265
outputSchema={
12791266
"type": "object",
12801267
"properties": {
1281-
"result": {"type": "number"},
1282-
"expression": {"type": "string"},
1268+
"temperature": {"type": "number", "description": "Temperature in Celsius"},
1269+
"condition": {"type": "string", "description": "Weather condition"},
1270+
"humidity": {"type": "number", "description": "Humidity percentage"},
1271+
"city": {"type": "string", "description": "City name"},
12831272
},
1284-
"required": ["result", "expression"],
1273+
"required": ["temperature", "condition", "humidity", "city"],
12851274
},
12861275
)
12871276
]
@@ -1290,19 +1279,21 @@ async def list_tools() -> list[types.Tool]:
12901279
@server.call_tool()
12911280
async def call_tool(name: str, arguments: dict[str, Any]) -> dict[str, Any]:
12921281
"""Handle tool calls with structured output."""
1293-
if name == "calculate":
1294-
expression = arguments["expression"]
1295-
try:
1296-
# WARNING: eval() is dangerous! Use a safe math parser in production
1297-
result = eval(expression)
1298-
structured = {"result": result, "expression": expression}
1299-
1300-
# low-level server will validate structured output against the tool's
1301-
# output schema, and automatically serialize it into a TextContent block
1302-
# for backwards compatibility with pre-2025-06-18 clients.
1303-
return structured
1304-
except Exception as e:
1305-
raise ValueError(f"Calculation error: {str(e)}")
1282+
if name == "get_weather":
1283+
city = arguments["city"]
1284+
1285+
# Simulated weather data - in production, call a weather API
1286+
weather_data = {
1287+
"temperature": 22.5,
1288+
"condition": "partly cloudy",
1289+
"humidity": 65,
1290+
"city": city, # Include the requested city
1291+
}
1292+
1293+
# low-level server will validate structured output against the tool's
1294+
# output schema, and additionally serialize it into a TextContent block
1295+
# for backwards compatibility with pre-2025-06-18 clients.
1296+
return weather_data
13061297
else:
13071298
raise ValueError(f"Unknown tool: {name}")
13081299

examples/snippets/servers/lowlevel/basic.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
"""Basic low-level server example.
2-
3-
This example demonstrates the low-level server API with minimal setup,
4-
showing how to implement basic prompts using the raw protocol handlers.
5-
1+
"""
62
Run from the repository root:
7-
uv run examples/snippets/servers/lowlevel/basic.py
3+
uv run examples/snippets/servers/lowlevel/basic.py
84
"""
95

106
import asyncio
@@ -36,7 +32,7 @@ async def handle_get_prompt(name: str, arguments: dict[str, str] | None) -> type
3632
if name != "example-prompt":
3733
raise ValueError(f"Unknown prompt: {name}")
3834

39-
arg1_value = arguments.get("arg1", "default") if arguments else "default"
35+
arg1_value = (arguments or {}).get("arg1", "default")
4036

4137
return types.GetPromptResult(
4238
description="Example prompt",

examples/snippets/servers/lowlevel/lifespan.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
"""Low-level server example showing lifespan management.
2-
3-
This example demonstrates how to use the lifespan API to manage
4-
server startup and shutdown, including resource initialization
5-
and cleanup.
6-
1+
"""
72
Run from the repository root:
83
uv run examples/snippets/servers/lowlevel/lifespan.py
94
"""

examples/snippets/servers/lowlevel/structured_output.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
"""Low-level server example showing structured output support.
2-
3-
This example demonstrates how to use the low-level server API to return
4-
structured data from tools, with automatic validation against output schemas.
5-
1+
"""
62
Run from the repository root:
73
uv run examples/snippets/servers/lowlevel/structured_output.py
84
"""
@@ -23,20 +19,22 @@ async def list_tools() -> list[types.Tool]:
2319
"""List available tools with structured output schemas."""
2420
return [
2521
types.Tool(
26-
name="calculate",
27-
description="Perform mathematical calculations",
22+
name="get_weather",
23+
description="Get current weather for a city",
2824
inputSchema={
2925
"type": "object",
30-
"properties": {"expression": {"type": "string", "description": "Math expression"}},
31-
"required": ["expression"],
26+
"properties": {"city": {"type": "string", "description": "City name"}},
27+
"required": ["city"],
3228
},
3329
outputSchema={
3430
"type": "object",
3531
"properties": {
36-
"result": {"type": "number"},
37-
"expression": {"type": "string"},
32+
"temperature": {"type": "number", "description": "Temperature in Celsius"},
33+
"condition": {"type": "string", "description": "Weather condition"},
34+
"humidity": {"type": "number", "description": "Humidity percentage"},
35+
"city": {"type": "string", "description": "City name"},
3836
},
39-
"required": ["result", "expression"],
37+
"required": ["temperature", "condition", "humidity", "city"],
4038
},
4139
)
4240
]
@@ -45,19 +43,21 @@ async def list_tools() -> list[types.Tool]:
4543
@server.call_tool()
4644
async def call_tool(name: str, arguments: dict[str, Any]) -> dict[str, Any]:
4745
"""Handle tool calls with structured output."""
48-
if name == "calculate":
49-
expression = arguments["expression"]
50-
try:
51-
# WARNING: eval() is dangerous! Use a safe math parser in production
52-
result = eval(expression)
53-
structured = {"result": result, "expression": expression}
46+
if name == "get_weather":
47+
city = arguments["city"]
48+
49+
# Simulated weather data - in production, call a weather API
50+
weather_data = {
51+
"temperature": 22.5,
52+
"condition": "partly cloudy",
53+
"humidity": 65,
54+
"city": city, # Include the requested city
55+
}
5456

55-
# low-level server will validate structured output against the tool's
56-
# output schema, and automatically serialize it into a TextContent block
57-
# for backwards compatibility with pre-2025-06-18 clients.
58-
return structured
59-
except Exception as e:
60-
raise ValueError(f"Calculation error: {str(e)}")
57+
# low-level server will validate structured output against the tool's
58+
# output schema, and additionally serialize it into a TextContent block
59+
# for backwards compatibility with pre-2025-06-18 clients.
60+
return weather_data
6161
else:
6262
raise ValueError(f"Unknown tool: {name}")
6363

0 commit comments

Comments
 (0)