菜单

代码生成

相关源文件

MCP Go SDK 包含一个代码生成系统,用于自动生成服务器实现中重复的 Go 代码结构。该系统生成请求处理器和钩子(hook)基础设施,以减少样板代码并确保代码库的一致性。

有关生成的服务器钩子(hook)和中间件的信息,请参阅钩子(Hooks)和中间件(Middleware)。有关使用生成代码的 MCP 服务器架构的详细信息,请参阅MCP 服务器

目的与架构

代码生成系统解决了 MCP 服务器实现中重复代码模式的需求,具体包括:

  • 将 JSON-RPC 方法调用路由到相应处理程序的请求分派 switch 语句
  • 在请求生命周期中提供可扩展点的钩子函数类型和方法
  • 在所有 MCP 协议方法中保持一致性的类型安全请求处理基础设施

该生成器使用 Go 的 text/template 包以及嵌入式模板文件,来生成格式化且导入优化的 Go 源代码。

代码生成流程

来源:server/internal/gen/main.go1-87 server/internal/gen/README.md1-25

模板系统

代码生成系统使用两个主要模板,将有关 MCP 请求类型的结构化数据转换为 Go 源代码:

模板文件

模板输出文件目的
hooks.go.tmplserver/hooks.go钩子函数类型和 Hook 结构体方法
request_handler.go.tmplserver/request_handler.go请求分派 switch 语句

模板函数

模板使用自定义函数在生成过程中转换数据:

  • toLower - 将字符串转换为小写以保持命名一致性

模板渲染器定义在 RenderTemplateToFile 函数中,该函数处理从模板解析到格式化输出的整个流程。

模板处理流程

来源:server/internal/gen/main.go23-72

生成产物

请求处理程序生成

生成的 request_handler.go 包含中央请求分派逻辑,该逻辑根据 MCP 协议规范将传入的 JSON-RPC 请求路由到相应的处理程序方法。这消除了在添加新请求类型时手动维护 switch 语句的需要。

钩子(Hook)基础设施生成

生成的 hooks.go 提供了可扩展性基础设施,允许开发人员在请求生命周期的各个点注入自定义逻辑。这包括:

  • 每种请求类型的钩子函数类型定义
  • 实现了钩子调用机制的 Hook 结构体上的方法
  • 用于前处理和后处理钩子的类型安全接口

生成过程

调用

代码生成通过 Go 的内置生成机制触发。

生成指令嵌入在主生成器文件中,位于server/internal/gen/main.go15

构建集成

该生成器通过多种机制与构建过程集成:

生成工作流

来源:server/internal/gen/main.go74-87 server/internal/gen/README.md9-13

错误处理

生成过程包括全面的错误处理:

  • 模板解析错误会在初始模板创建时捕获
  • 模板执行错误会报告失败数据的上下文信息
  • goimports 失败会包含命令输出以供调试
  • 文件 I/O 错误会提供清晰的文件系统问题反馈

RenderTemplateToFile 函数集中处理这些错误,以确保两个生成文件之间的一致行为。

开发工作流

添加新的请求类型

为新的 MCP 请求类型扩展代码生成系统:

  1. 更新 data.go 中的 MCPRequestTypes 数据结构(已引用但未在提供的文件中显示)
  2. 运行 go generate ./... 以重新生成代码
  3. 验证生成的代码能够编译并通过测试

模板修改

修改模板时:

  1. 编辑 server/internal/gen/ 目录中的 .tmpl 文件
  2. 使用代表性数据测试模板更改
  3. 重新生成并验证输出
  4. 确保 goimports 能够成功格式化生成的代码

调试生成

该生成器提供了多种调试功能:

  • 生成过程中会创建临时文件以供检查
  • goimports 输出会在失败时被捕获和报告
  • 生成器可以通过将目标路径指定为“-”来输出到标准输出

来源:server/internal/gen/main.go46-49 server/internal/gen/main.go58-71 server/internal/gen/README.md16-24