本文档提供了完整 MCP 服务器示例实现的详细演练,该示例展示了 MCP Go SDK 的所有主要功能。该示例展示了如何构建一个功能齐全的 MCP 服务器,包含资源、提示、工具、钩子、通知和多种传输机制。
有关单个服务器组件的信息,请参阅MCP 服务器。有关特定于传输的详细信息,请参阅传输机制。有关测试服务器实现的信息,请参阅服务器测试。
位于examples/everything/main.go 的完整服务器示例展示了一个生产就绪的 MCP 服务器实现,它展示了 MCP Go SDK 的所有主要功能。此示例既可作为参考实现,也可作为所有服务器功能的测试平台。
该服务器实现了多种工具类型、资源处理模式、提示模板、全面的钩子使用和通知系统,同时支持标准输入输出(stdio)和 HTTP 传输。
服务器架构
来源:examples/everything/main.go33-169
服务器使用启用了全面功能的 server.NewMCPServer 构造函数进行配置。该配置展示了生产服务器设置的最佳实践。
服务器设置组件
| 组件 | 配置 | 目的 |
|---|---|---|
| 服务器标识 | "example-servers/everything", "1.0.0" | 用于客户端的服务器标识 |
| 资源能力 | WithResourceCapabilities(true, true) | 启用资源读取和订阅 |
| 提示能力 | WithPromptCapabilities(true) | 启用提示列表更改 |
| 工具能力 | WithToolCapabilities(true) | 启用工具执行 |
| 日志记录 | WithLogging() | 启用请求/响应日志记录 |
| 钩子 | WithHooks(hooks) | 附加生命周期钩子 |
服务器初始化发生在 NewMCPServer 函数中,该函数创建了一个配置完整且所有功能都已启用的服务器实例。
来源:examples/everything/main.go64-72
该示例展示了请求生命周期管理的全面钩子使用,提供了对请求处理所有阶段的深入了解。
钩子实现模式
钩子系统提供以下拦截点
来源:examples/everything/main.go35-62
服务器演示了三种资源实现模式:静态资源、资源模板和动态生成的资源。
资源类型和处理程序
| 资源类型 | URI 模式 | 处理函数 | 内容类型 |
|---|---|---|---|
| 静态 | test://static/resource | handleReadResource | text/plain |
| 模板 | test://dynamic/resource/{id} | handleResourceTemplate | text/plain |
| 生成 | test://static/resource/1-100 | handleGeneratedResource | 混合内容 |
生成的资源展示了内容类型的变化,其中偶数资源返回文本内容,奇数资源返回二进制大对象内容。
资源注册流程
generateResources 函数以编程方式创建了 100 个资源,展示了可伸缩的资源管理模式。
来源:examples/everything/main.go74-89 examples/everything/main.go171-190 examples/everything/main.go192-253
服务器实现了五种不同的工具类型,展示了 MCP Go SDK 中可用的不同工具模式和功能。
工具目录
| 工具名称 | 参数 | 返回类型 | 特殊功能 |
|---|---|---|---|
echo | message: string | 文本内容 | 基本字符串处理 |
add | a: number, b: number | 文本内容 | 数值计算 |
notify | 无 | 文本内容 | 发送通知 |
longRunningOperation | duration: number, steps: number | 文本内容 | 进度通知 |
getTinyImage | 无 | 混合内容 | 图像数据处理 |
工具执行流程
longRunningOperation 工具演示了高级功能,包括进度令牌处理和工具执行期间服务器发起的通知。
来源:examples/everything/main.go105-164 examples/everything/main.go311-467
服务器实现了两种提示模式:一种是不带参数的简单提示,另一种是带有必需参数和多模态内容的复杂提示。
提示规范
| 提示名称 | 参数 | 消息类型 | 特性 |
|---|---|---|---|
simple_prompt | 无 | 仅用户文本 | 基本提示模板 |
complex_prompt | temperature, style | 用户文本、助手文本、用户图像 | 多模态对话 |
复杂提示演示了参数插值和多模态内容,包括使用 MCP_TINY_IMAGE 常量嵌入图像数据。
提示消息结构
来源:examples/everything/main.go91-104 examples/everything/main.go255-309
服务器实现了通知发送和接收功能,展示了双向通信模式。
通知机制
服务器提供两种通知场景
notify 工具发送即时通知longRunningOperation 工具发送周期性进度更新通知流程
通知系统使用 server.ServerFromContext(ctx) 模式从工具处理程序访问服务器实例。
来源:examples/everything/main.go351-378 examples/everything/main.go381-423 examples/everything/main.go469-474
服务器支持标准输入输出(stdio)和 HTTP 两种传输方式,可通过命令行选择,展示了灵活的部署选项。
传输配置
| 传输 | 命令行 | 服务器类型 | 端点 |
|---|---|---|---|
| Stdio | --transport=stdio (默认) | server.ServeStdio | stdin/stdout |
| HTTP | --transport=http | server.NewStreamableHTTPServer | :8080/mcp |
服务器启动流程
HTTP 服务器在 /mcp 提供 RESTful 端点,而 stdio 服务器支持命令行集成和基于进程的通信。
来源:examples/everything/main.go476-496
该示例可以以两种模式执行
Stdio 模式(默认)
HTTP 模式
该服务器展示了生产就绪的模式,包括错误处理、日志记录、进度报告以及适用于实际 MCP 服务器实现的全面功能覆盖。