本项目是基于 Model Context Protocol (MCP) 的示例实现,展示了如何构建 MCP 客户端与服务器,并集成 OpenAI 工具调用能力。项目提供了完整的 MCP 协议交互流程、工具管理机制以及与 LLM (大语言模型) 的集成方案,可作为基于 MCP 协议开发 AI 工具服务的参考示例。
- 完整的 MCP 客户端/服务器实现,遵循 Model Context Protocol 规范
- 多服务器管理与工具自动发现机制
- 与 OpenAI 工具调用格式的无缝转换
- 聊天会话管理,支持 LLM 交互与工具调用流程
- 集成钉钉聊天机器人回调处理
- 提供 100+ 趣味工具示例,展示工具注册与调用方式
核心代码位于 mcp/pkg/mcp 目录,包含 MCP 协议的核心实现:
mcp/pkg/mcp/
├── chat_session.go // 聊天会话管理,处理 LLM 交互与工具调用流程
├── llm_client.go // LLM 客户端,封装 OpenAI 接口调用
├── mcp_client.go // MCP 客户端实现,处理与服务器的连接和通信
└── mcp_manager.go // MCP 服务器管理器,管理多服务器与工具映射
实现与 MCP 服务器的底层通信,包括:
- 建立与服务器的连接
- 获取服务器提供的工具列表(自动转换为 OpenAI 工具格式)
- 执行指定工具(包含重试机制)
- 关闭连接释放资源
// 示例:创建客户端并调用工具
client := mcp.NewMCPSeverClient("demo-server", "localhost:8080")
err := client.Connect(ctx)
if err != nil {
// 处理错误
}
// 获取工具列表
tools, err := client.ListTools(ctx)
// 执行工具
result, err := client.ExecuteTool(ctx, "rainbowFart", map[string]interface{}{})管理多个 MCP 服务器,提供统一接口:
- 批量连接所有配置的 MCP 服务器
- 构建工具与服务器的映射关系(自动发现可用工具)
- 提供全局工具调用入口(自动选择可用服务器)
- 支持工具映射刷新与连接管理
// 示例:创建管理器并使用
manager, err := mcp.NewMCPManager()
if err != nil {
// 处理错误
}
// 连接所有服务器
err := manager.ConnectAll(ctx)
// 获取所有可用工具
allTools, err := manager.GetAllTools(ctx)
// 执行工具(自动选择合适的服务器)
result, err := manager.ExecuteTool(ctx, "rockPaperScissors", map[string]interface{}{"choice": "rock"})处理与 LLM 的交互流程,包括:
- 维护对话历史记录
- 构建包含工具信息的系统提示
- 处理 LLM 响应(支持流式与非流式)
- 解析工具调用指令并执行
- 整合工具返回结果生成自然语言响应
// 示例:创建聊天会话
session := mcp.NewChatSession(llmClient, mcpManager, callbackData)
err := session.Init(ctx)
// 处理用户输入
err := session.HandleUserInput(ctx, "给我来一句彩虹屁")在 mcp/cmd/server/server3.go 中展示了 100+ 趣味工具的注册方式,例如:
- 彩虹屁生成器 (
rainbowFart) - 猜拳游戏 (
rockPaperScissors) - 中二台词生成 (
chuuniLine) - 冷门电影推荐 (
obscureMovie) - 城市小众景点推荐 (
hiddenSpot)
这些工具示例展示了如何按照 MCP 规范注册工具,定义输入输出格式。
项目实现了 MCP 协议与 OpenAI 工具调用格式的双向转换:
- MCP 工具元数据自动转换为 OpenAI
FunctionDefinition格式 - OpenAI 工具调用指令自动解析并转换为 MCP 调用参数
- 支持工具调用结果的格式化处理,便于 LLM 理解
// 创建服务器实例
server := mcp.NewServer(
&mcp.Implementation{
Name: "fun-tools-collection",
Version: "v1.0.0",
},
nil,
)
// 注册工具(示例)
mcp.AddTool[RainbowFartInput, map[string]interface{}](
server,
&mcp.Tool{Name: "rainbowFart", Description: "生成一句有趣的彩虹屁夸赞"},
RainbowFart,
)
// 启动服务器
server.Start(":8080")// 创建管理器
manager, err := mcp.NewMCPManager()
if err != nil {
log.Fatal(err)
}
// 连接服务器
err = manager.ConnectAll(ctx)
if err != nil {
log.Printf("连接错误: %v", err)
}
// 执行工具
result, err := manager.ExecuteTool(ctx, "rainbowFart", map[string]interface{}{})
if err != nil {
log.Printf("工具调用失败: %v", err)
} else {
log.Printf("结果: %v", result)
}// 初始化 LLM 客户端
llm := NewLLMClient(openaiAPIKey, true)
// 创建聊天会话
session := NewChatSession(llm, manager, callbackData)
err := session.Init(ctx)
if err != nil {
log.Fatal(err)
}
// 处理用户输入
err = session.HandleUserInput(ctx, "推荐一个冷门电影")本项目提供了 MCP 协议的完整示例实现,展示了如何构建支持 LLM 工具调用的服务生态。通过封装 MCP 客户端/服务器交互、工具管理和会话流程,简化了 AI 代理与外部工具的集成过程,可作为构建更复杂 AI 应用的基础框架。