前言

在《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)