Source code for agentstr.mcp.pydantic
from typing import Any, Union
from pydantic_ai import Agent, RunContext
from pydantic_ai.tools import ToolDefinition
from agentstr.nostr_mcp_client import NostrMCPClient
from pydantic_ai import Tool
[docs]
async def to_pydantic_tools(nostr_mcp_client: NostrMCPClient) -> list[Tool]:
"""Convert tools from the MCP client to Pydantic tools.
Args:
nostr_mcp_client: An instance of NostrMCPClient to fetch tools from.
Returns:
A list of Pydantic tools that wrap the MCP tools.
"""
def call_tool(
tool_name: str,
):
async def inner(arguments: dict[str, Any]):
result = await nostr_mcp_client.call_tool(tool_name, arguments)
return result
return inner
tools = await nostr_mcp_client.list_tools()
tool_to_schema = {}
for tool in tools["tools"]:
tool_to_schema[tool["name"]] = {"type": "object", "properties": {"arguments": tool["inputSchema"]}, "required": ['arguments']}
async def prepare_tool(ctx: RunContext[Any], tool_def: ToolDefinition) -> Union[ToolDefinition, None]:
tool_def.parameters_json_schema = tool_to_schema.get(tool_def.name)
return tool_def
return [
Tool(
name=tool["name"],
description=tool["description"],
function=call_tool(tool["name"]),
prepare=prepare_tool,
takes_ctx=False,
) for tool in tools["tools"]
]