菜单

自定义上下文实现

相关源文件

本页解释了如何使用模型控制协议(MCP)实现和使用自定义上下文。自定义上下文允许您将传输层特定信息传递给工具处理程序,而无需将您的工具直接耦合到传输层。这创建了更灵活、可重用和可测试的组件。

有关传输机制本身的信息,请参阅传输机制

理解 MCP 中的上下文

在 Go 语言中,context.Context是一个标准接口,用于在 API 边界之间传递截止日期、取消信号和请求范围的值。MCP 利用此功能,允许将传输层特定信息传递给工具处理程序,而无需直接耦合。

来源:server/sse_test.go550-690 server/stdio_test.go117-269 examples/custom_context/main.go1-166

每种传输类型(SSE 或 stdio)都允许您指定一个自定义上下文函数,该函数可以

  1. 访问传输层特定信息(HTTP 标头、环境变量等)
  2. 将此信息存储在上下文中
  3. 将丰富后的上下文传递给工具处理程序

这使得工具可以访问这些值,而无需直接依赖于传输机制。

自定义上下文函数

MCP 根据传输类型支持不同的上下文函数签名

来源:server/sse_test.go564-566 server/stdio_test.go131-133 examples/custom_context/main.go26-33

SSE 上下文函数

使用 SSE 传输时,上下文函数可以访问 HTTP 请求,从而允许您从请求头、查询参数或 Cookie 中提取信息

此函数通过以下方式应用

来源:examples/custom_context/main.go26-28 examples/custom_context/main.go128

Stdio 上下文函数

使用 stdio 传输时,上下文函数无法访问传输层特定信息,但可以从环境中提取数据

此函数通过以下方式应用

来源:examples/custom_context/main.go31-33 examples/custom_context/main.go133

在工具处理程序中访问上下文值

工具处理程序接收丰富后的上下文,并可以使用辅助函数提取值

来源:examples/custom_context/main.go38-44 examples/custom_context/main.go80-98

这是一个辅助函数示例,用于从上下文中提取值

以及一个使用此函数的工具处理程序

来源:examples/custom_context/main.go38-44 examples/custom_context/main.go80-98

完整示例:认证上下文

以下示例展示了用于传递认证令牌的自定义上下文的完整实现

来源:examples/custom_context/main.go17-98

此实现中的关键组件

  1. 上下文键:用于上下文键的自定义类型,以避免键冲突

  2. 上下文辅助函数:从上下文中添加和提取值的函数

  3. 传输层特定函数:从不同传输层提取信息的函数

  4. 工具处理程序:使用上下文值的与传输层无关的工具

  5. 服务器配置:使用适当的上下文函数配置服务器

来源:examples/custom_context/main.go17-44 examples/custom_context/main.go80-98 examples/custom_context/main.go125-133

最佳实践

在 MCP 中实现自定义上下文时,请考虑以下最佳实践

  1. 使用唯一的上下文键:为上下文键定义特定的结构类型以避免冲突

  2. 创建辅助函数:将上下文操作抽象为辅助函数

  3. 保持工具与传输层无关:工具处理程序不应了解传输层

  4. 验证上下文值:始终检查值是否存在且类型是否符合预期

  5. 文档化上下文要求:清楚地记录工具期望从上下文中获取哪些值

  6. 测试:使用模拟上下文测试工具,以确保它们在不同上下文值下行为正确

来源:examples/custom_context/main.go17-44 server/sse_test.go550-690 server/stdio_test.go117-269

总结

自定义上下文实现提供了一种干净的方式,将传输层特定信息传递给工具处理程序,而无需将它们耦合到传输层。这种模式

  • 通过使业务逻辑独立于传输层细节来提高模块化
  • 通过允许工具使用模拟上下文进行测试来增强可测试性
  • 支持使用相同的工具处理程序处理多种传输机制
  • 提供了在系统中传递请求范围值的标准方式

通过遵循本文档中演示的模式,您可以创建灵活、可维护的 MCP 应用程序,这些应用程序可以在不同的传输机制中无缝工作。

来源:examples/custom_context/main.go1-166 server/sse_test.go550-690 server/stdio_test.go117-269