本页解释了如何使用模型控制协议(MCP)实现和使用自定义上下文。自定义上下文允许您将传输层特定信息传递给工具处理程序,而无需将您的工具直接耦合到传输层。这创建了更灵活、可重用和可测试的组件。
有关传输机制本身的信息,请参阅传输机制。
在 Go 语言中,context.Context是一个标准接口,用于在 API 边界之间传递截止日期、取消信号和请求范围的值。MCP 利用此功能,允许将传输层特定信息传递给工具处理程序,而无需直接耦合。
来源:server/sse_test.go550-690 server/stdio_test.go117-269 examples/custom_context/main.go1-166
每种传输类型(SSE 或 stdio)都允许您指定一个自定义上下文函数,该函数可以
这使得工具可以访问这些值,而无需直接依赖于传输机制。
MCP 根据传输类型支持不同的上下文函数签名
来源:server/sse_test.go564-566 server/stdio_test.go131-133 examples/custom_context/main.go26-33
使用 SSE 传输时,上下文函数可以访问 HTTP 请求,从而允许您从请求头、查询参数或 Cookie 中提取信息
此函数通过以下方式应用
来源:examples/custom_context/main.go26-28 examples/custom_context/main.go128
使用 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
此实现中的关键组件
上下文键:用于上下文键的自定义类型,以避免键冲突
上下文辅助函数:从上下文中添加和提取值的函数
传输层特定函数:从不同传输层提取信息的函数
工具处理程序:使用上下文值的与传输层无关的工具
服务器配置:使用适当的上下文函数配置服务器
来源:examples/custom_context/main.go17-44 examples/custom_context/main.go80-98 examples/custom_context/main.go125-133
在 MCP 中实现自定义上下文时,请考虑以下最佳实践
使用唯一的上下文键:为上下文键定义特定的结构类型以避免冲突
创建辅助函数:将上下文操作抽象为辅助函数
保持工具与传输层无关:工具处理程序不应了解传输层
验证上下文值:始终检查值是否存在且类型是否符合预期
文档化上下文要求:清楚地记录工具期望从上下文中获取哪些值
测试:使用模拟上下文测试工具,以确保它们在不同上下文值下行为正确
来源: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