工具调用链路与扩展点介绍

本节说明一次 GPA MCP 工具调用从 LLM 发起到结果返回的完整链路,以及各类扩展代码分别挂在哪个位置。理解调用链路后,再进入开发准备和具体场景会更容易判断应该配置哪个 Handler。

调用链路

GPA MCP 工具调用链路与扩展点流程图

扩展点说明

钩子 工具 JSON 字段 执行时机 能做什么 默认函数名
preHandler preHandler 业务执行之前 校验/改写 arguments、tool_config;可中断执行 pre_handle
resultHandler resultHandler 业务执行成功之后 改写/重建最终结果 ctx.result handle_result
postHandler postHandler 结果确定之后、返回给 LLM 之前 做副作用(记录、通知等),不改返回值 post_handle
自定义 businessHandler businessHandler 替代整个②段 完全自己实现业务逻辑(如调用外部 API) handle

大多数需求可以按扩展点选择:需要在执行前校验或改写请求时阅读场景一:自定义调用前逻辑;工具的执行逻辑完全不是“调用 GPA 算子”或“查询数据目录”等内置模式时阅读场景二:自定义业务处理;需要调整返回给 LLM 的内容时阅读场景三:自定义返回结果;需要在执行后记录日志、审计或通知外部系统时阅读场景四:自定义调用后逻辑。

异常行为说明

四段钩子的失败语义并不一致—业务已经执行成功之后的 postHandler 出错不应该让用户拿不到结果,但结果尚未产出前的 preHandler/resultHandler 出错必须阻断,避免带着无效数据继续往下走。开发钩子函数时请对照下表处理异常:

阶段 出错行为
preHandler 抛 HandlerAbort 阻断,把 message/suggestions 包成错误返回给 LLM
preHandler 抛其他异常 阻断,返回通用错误
resultHandler 抛任何异常 阻断,返回错误(同 preHandler,不含 suggestions 除非也用 HandlerAbort)
postHandler 抛任何异常 不阻断,只记 warning 日志,正常把结果返回给 LLM
自定义 businessHandler 中 ctx.result 表示失败 按标准错误响应处理,跳过 postHandler
文件不存在 / 函数不存在 / 模块 import 失败 阻断,返回 "Handler configuration error"——不会静默跳过,工具调用直接失败,方便第一时间发现配置写错了

理解了扩展代码的执行顺序后,请继续阅读开发准备,完成目录、配置字段和钩子函数签名的准备工作。