前言
在《Tool 与 MCP 设计思路》一节中我们提到了几个工具,那么这一节我们就来手把手的写2个工具,并交给大模型使用。
核心代码目录:app/tools
当前时间查询工具
@tool 会从函数本身自动推导元数据:
| 字段 | 来源 |
|---|---|
| name | 函数名 → get_current_time |
| description | 函数 docstring(三引号文档字符串) |
| 参数 schema | 类型注解 + docstring 里的 Args:(LangChain 会解析) |
实际跑起来就是:
name: get_current_time
description: '获取当前时间\n\n当用户询问"现在几点"...'
想显式指定 name / description 时
@tool("current_time", description="返回指定时区的当前日期时间")
def get_current_time(timezone: str = "Asia/Shanghai") -> str:
...
@tool
def get_current_time(timezone: str = "Asia/Shanghai") -> str:
"""获取当前时间
当用户询问"现在几点"、"今天星期几"、"今天日期"等时间相关问题时,使用此工具。
Args:
timezone: 时区,默认为 Asia/Shanghai(北京时间)
Returns:
str: 格式化的当前时间信息
"""
try:
# 获取指定时区的当前时间
tz = ZoneInfo(timezone)
now = datetime.now(tz)
# 返回格式化的日期时间字符串
return now.strftime('%Y-%m-%d %H:%M:%S')
except Exception as e:
logger.error(f"时间查询工具调用失败: {e}")
return f"获取时间失败: {str(e)}"
腾讯云日志MCP工具
通过 MCP Server 查询日志服务 CLS 中存储的日志数据,以实现大模型平台/工具与日志数据的结合。例如使用自然语言查询日志,降低日志查询复杂度 https://cloud.tencent.com/developer/mcp/server/11710
MCP配置:[环境准备教程](/oncall/智能 OnCall Agent 项目/第八章 _ 实战演练与运行项目/环境准备教程/)
首先我们创建一个 SSE MCP 客户端。创建后进行初始化,最后调用load_mcp_tools_safe获取所有可用的工具即可。其中client.get_tools()是langchain提供的api,只需要会调用即可。
async def load_mcp_tools_safe(
client: MultiServerMCPClient,
) -> tuple[list[Union[BaseTool, Any]], str | None]:
"""加载 MCP 工具;失败时返回空列表与可读错误信息,不向上抛出。"""
try:
tools = await client.get_tools()
return tools, None
except BaseException as e:
return [], format_exception_chain(e)