场景四:自定义调用后逻辑

调用后逻辑通过 postHandler 实现,在业务结果已经确定、返回给 LLM 之前执行。它适合记录日志、写审计、通知外部系统等副作用。postHandler 拿到的 ctx.result 是深拷贝,修改它不会改变真正返回给 LLM 的结果;如果需要改写返回内容,请使用场景三:自定义返回结果。

第一步:编写调用后逻辑

接续场景一:自定义调用前逻辑中的 createBuffer 示例,在产品包目录 /cfg/gpa_mcp/v2_handlers/ 下的 buffer_hooks.py 中增加 notify_result 函数:

import time
from mcptools.v2.handler_api import HandlerContext

async def notify_result(ctx: HandlerContext):
"""postHandler:结果已确定,只做副作用"""
elapsed = time.time() - ctx.state.get("t0", time.time())
ctx.services.logger.info(f"{ctx.tool_name} 执行耗时 {elapsed:.2f}s")
# 也可以在这里写审计记录或调用外部通知接口

notify_result 在结果已经确定之后执行,适合读取 ctx.state、ctx.tool_name、ctx.result 等上下文信息来完成审计或通知。postHandler 抛出的异常不会阻断结果返回,只会被记录为 warning 日志。

第二步:挂到工具 JSON 上

如果只需要调用后逻辑,可以仅配置 postHandler;如果需要读取调用前写入的 ctx.state,则同时配置 preHandler 和 postHandler:

{
"name": "createBuffer",
"gpaToolId": "iobjects_vectoranalyst:createbuffer",
"preHandler": "buffer_hooks:validate_distance",
"postHandler": "buffer_hooks:notify_result"
}

注意:

postHandler 不适合承担返回结果加工职责。需要补充、删减或重组返回给 LLM 的内容时,请配置 resultHandler;需要阻断不合规请求时,请配置 preHandler。

保存文件并按收尾:部署、验证与排错中的方法验证即可,不需要重启容器。