Skip to content

Commit dd79297

Browse files
Docs: Update CallToolResult parsing in README (#812)
Co-authored-by: Felix Weinberger <[email protected]>
1 parent c0bc666 commit dd79297

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed

README.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
- [Advanced Usage](#advanced-usage)
4545
- [Low-Level Server](#low-level-server)
4646
- [Writing MCP Clients](#writing-mcp-clients)
47+
- [Parsing Tool Results](#parsing-tool-results)
4748
- [MCP Primitives](#mcp-primitives)
4849
- [Server Capabilities](#server-capabilities)
4950
- [Documentation](#documentation)
@@ -1605,6 +1606,75 @@ async def main():
16051606

16061607
For a complete working example, see [`examples/clients/simple-auth-client/`](examples/clients/simple-auth-client/).
16071608

1609+
### Parsing Tool Results
1610+
1611+
When calling tools through MCP, the `CallToolResult` object contains the tool's response in a structured format. Understanding how to parse this result is essential for properly handling tool outputs.
1612+
1613+
```python
1614+
"""examples/snippets/clients/parsing_tool_results.py"""
1615+
1616+
import asyncio
1617+
1618+
from mcp import ClientSession, StdioServerParameters, types
1619+
from mcp.client.stdio import stdio_client
1620+
1621+
1622+
async def parse_tool_results():
1623+
"""Demonstrates how to parse different types of content in CallToolResult."""
1624+
server_params = StdioServerParameters(
1625+
command="python", args=["path/to/mcp_server.py"]
1626+
)
1627+
1628+
async with stdio_client(server_params) as (read, write):
1629+
async with ClientSession(read, write) as session:
1630+
await session.initialize()
1631+
1632+
# Example 1: Parsing text content
1633+
result = await session.call_tool("get_data", {"format": "text"})
1634+
for content in result.content:
1635+
if isinstance(content, types.TextContent):
1636+
print(f"Text: {content.text}")
1637+
1638+
# Example 2: Parsing structured content from JSON tools
1639+
result = await session.call_tool("get_user", {"id": "123"})
1640+
if hasattr(result, "structuredContent") and result.structuredContent:
1641+
# Access structured data directly
1642+
user_data = result.structuredContent
1643+
print(f"User: {user_data.get('name')}, Age: {user_data.get('age')}")
1644+
1645+
# Example 3: Parsing embedded resources
1646+
result = await session.call_tool("read_config", {})
1647+
for content in result.content:
1648+
if isinstance(content, types.EmbeddedResource):
1649+
resource = content.resource
1650+
if isinstance(resource, types.TextResourceContents):
1651+
print(f"Config from {resource.uri}: {resource.text}")
1652+
elif isinstance(resource, types.BlobResourceContents):
1653+
print(f"Binary data from {resource.uri}")
1654+
1655+
# Example 4: Parsing image content
1656+
result = await session.call_tool("generate_chart", {"data": [1, 2, 3]})
1657+
for content in result.content:
1658+
if isinstance(content, types.ImageContent):
1659+
print(f"Image ({content.mimeType}): {len(content.data)} bytes")
1660+
1661+
# Example 5: Handling errors
1662+
result = await session.call_tool("failing_tool", {})
1663+
if result.isError:
1664+
print("Tool execution failed!")
1665+
for content in result.content:
1666+
if isinstance(content, types.TextContent):
1667+
print(f"Error: {content.text}")
1668+
1669+
1670+
async def main():
1671+
await parse_tool_results()
1672+
1673+
1674+
if __name__ == "__main__":
1675+
asyncio.run(main())
1676+
```
1677+
16081678
### MCP Primitives
16091679

16101680
The MCP protocol defines three core primitives that servers can implement:
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
"""examples/snippets/clients/parsing_tool_results.py"""
2+
3+
import asyncio
4+
5+
from mcp import ClientSession, StdioServerParameters, types
6+
from mcp.client.stdio import stdio_client
7+
8+
9+
async def parse_tool_results():
10+
"""Demonstrates how to parse different types of content in CallToolResult."""
11+
server_params = StdioServerParameters(command="python", args=["path/to/mcp_server.py"])
12+
13+
async with stdio_client(server_params) as (read, write):
14+
async with ClientSession(read, write) as session:
15+
await session.initialize()
16+
17+
# Example 1: Parsing text content
18+
result = await session.call_tool("get_data", {"format": "text"})
19+
for content in result.content:
20+
if isinstance(content, types.TextContent):
21+
print(f"Text: {content.text}")
22+
23+
# Example 2: Parsing structured content from JSON tools
24+
result = await session.call_tool("get_user", {"id": "123"})
25+
if hasattr(result, "structuredContent") and result.structuredContent:
26+
# Access structured data directly
27+
user_data = result.structuredContent
28+
print(f"User: {user_data.get('name')}, Age: {user_data.get('age')}")
29+
30+
# Example 3: Parsing embedded resources
31+
result = await session.call_tool("read_config", {})
32+
for content in result.content:
33+
if isinstance(content, types.EmbeddedResource):
34+
resource = content.resource
35+
if isinstance(resource, types.TextResourceContents):
36+
print(f"Config from {resource.uri}: {resource.text}")
37+
elif isinstance(resource, types.BlobResourceContents):
38+
print(f"Binary data from {resource.uri}")
39+
40+
# Example 4: Parsing image content
41+
result = await session.call_tool("generate_chart", {"data": [1, 2, 3]})
42+
for content in result.content:
43+
if isinstance(content, types.ImageContent):
44+
print(f"Image ({content.mimeType}): {len(content.data)} bytes")
45+
46+
# Example 5: Handling errors
47+
result = await session.call_tool("failing_tool", {})
48+
if result.isError:
49+
print("Tool execution failed!")
50+
for content in result.content:
51+
if isinstance(content, types.TextContent):
52+
print(f"Error: {content.text}")
53+
54+
55+
async def main():
56+
await parse_tool_results()
57+
58+
59+
if __name__ == "__main__":
60+
asyncio.run(main())

0 commit comments

Comments
 (0)