Skip to content

meetwangdk/mcp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MCP (Model Context Protocol) 示例项目

概述

本项目是基于 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 服务器管理器,管理多服务器与工具映射

核心组件说明

1. MCP 客户端 (mcp_client.go)

实现与 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{}{})

2. MCP 管理器 (mcp_manager.go)

管理多个 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"})

3. 聊天会话管理 (chat_session.go)

处理与 LLM 的交互流程,包括:

  • 维护对话历史记录
  • 构建包含工具信息的系统提示
  • 处理 LLM 响应(支持流式与非流式)
  • 解析工具调用指令并执行
  • 整合工具返回结果生成自然语言响应
// 示例:创建聊天会话
session := mcp.NewChatSession(llmClient, mcpManager, callbackData)
err := session.Init(ctx)

// 处理用户输入
err := session.HandleUserInput(ctx, "给我来一句彩虹屁")

4. 工具示例集

mcp/cmd/server/server3.go 中展示了 100+ 趣味工具的注册方式,例如:

  • 彩虹屁生成器 (rainbowFart)
  • 猜拳游戏 (rockPaperScissors)
  • 中二台词生成 (chuuniLine)
  • 冷门电影推荐 (obscureMovie)
  • 城市小众景点推荐 (hiddenSpot)

这些工具示例展示了如何按照 MCP 规范注册工具,定义输入输出格式。

协议集成

项目实现了 MCP 协议与 OpenAI 工具调用格式的双向转换:

  • MCP 工具元数据自动转换为 OpenAI FunctionDefinition 格式
  • OpenAI 工具调用指令自动解析并转换为 MCP 调用参数
  • 支持工具调用结果的格式化处理,便于 LLM 理解

快速开始

1. 启动 MCP 服务器

// 创建服务器实例
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")

2. 客户端连接与使用

// 创建管理器
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)
}

3. 与 LLM 集成

// 初始化 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 应用的基础框架。

About

mcp openAI

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages