import asyncio from hello_agents.protocols import MCPClient async def connect_to_server(): # 方式1:连接到社区提供的文件系统服务器 # npx会自动下载并运行@modelcontextprotocol/server-filesystem包 client = MCPClient([ "npx", "-y", "@modelcontextprotocol/server-filesystem", "." # 指定根目录 ]) # 使用async with确保连接正确关闭 async with client: # 在这里使用client tools = await client.list_tools() print(f"可用工具: {[t['name'] for t in tools]}") # 方式2:连接到自定义的Python MCP服务器 client = MCPClient(["python", "my_mcp_server.py"]) async with client: # 使用client... pass # 运行异步函数 asyncio.run(connect_to_server()) async def discover_tools(): client = MCPClient(["npx", "-y", "@modelcontextprotocol/server-filesystem", "."]) async with client: # 获取所有可用工具 tools = await client.list_tools() print(f"服务器提供了 {len(tools)} 个工具:") for tool in tools: print(f"\n工具名称: {tool['name']}") print(f"描述: {tool.get('description', '无描述')}") # 打印参数信息 if 'inputSchema' in tool: schema = tool['inputSchema'] if 'properties' in schema: print("参数:") for param_name, param_info in schema['properties'].items(): param_type = param_info.get('type', 'any') param_desc = param_info.get('description', '') print(f" - {param_name} ({param_type}): {param_desc}") asyncio.run(discover_tools()) # 输出示例: # 服务器提供了 5 个工具: # # 工具名称: read_file # 描述: 读取文件内容 # 参数: # - path (string): 文件路径 # # 工具名称: write_file # 描述: 写入文件内容 # 参数: # - path (string): 文件路径 # - content (string): 文件内容 async def use_tools(): client = MCPClient(["npx", "-y", "@modelcontextprotocol/server-filesystem", "."]) async with client: # 读取文件 result = await client.call_tool("read_file", {"path": "my_README.md"}) print(f"文件内容:\n{result}") # 列出目录 result = await client.call_tool("list_directory", {"path": "."}) print(f"当前目录文件:{result}") # 写入文件 result = await client.call_tool("write_file", { "path": "output.txt", "content": "Hello from MCP!" }) print(f"写入结果:{result}") asyncio.run(use_tools()) async def safe_tool_call(): client = MCPClient(["npx", "-y", "@modelcontextprotocol/server-filesystem", "."]) async with client: try: # 尝试读取可能不存在的文件 result = await client.call_tool("read_file", {"path": "nonexistent.txt"}) print(result) except Exception as e: print(f"工具调用失败: {e}") # 可以选择重试、使用默认值或向用户报告错误 asyncio.run(safe_tool_call())